A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-13 21:48  /  1206 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class StringTest3{
  2.         public static void main(String[] args){
  3.                 String s1="abewmfhelloghesa";
  4.                 String s2="jnmdhellopq";
  5.                 Sop(getMaxSubString(s1,s2));
  6.                
  7.                 }
  8.         public static  void Sop(Object obj){
  9.                 System.out.println(obj);
  10.                 }
  11.         public static String getMaxSubString(String s1,String s2){
  12.                 for(int x=0;x<s2.length();x++)
  13.                   {
  14.                           for(int y=0,z=s2.length()-x;z!=s2.length()+1;y++,z++)
  15.                         {
  16.                                 String temp= s2.substring(y,z);
  17.                                 //Sop(temp);
  18.                                 if(s1.contains(temp))
  19.                                     return temp;
  20.                         }
  21.                    }
  22.                    return "";
  23.                 }
  24.         }
复制代码
有如上代码:在getMaxSubString方法的内层循环中z的值是随着外层循环x的值的增加而递减,为什么还要z++?为什么要用z!=s2.length()+1来控制循环结束?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

2 个回复

倒序浏览
z=s2.length()-x;这里是初始化z的值,只在内循环每次开始的时候执行一次;z++是每次内循环都要执行的。也就是说每次内循环开始都给z赋值(这个值是随着外层x的增加而递减),然后开始内循环,循环一次z++执行一次,直到z!=s2.length()+1为false结束。如果不用z!=s2.length()+1控制循环结束,s2.substring(y,z)取字符串时就会超出角标范围报错。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈腾跃_2013 于 2013-3-14 18:38 编辑

举个例子:假设
String s1 = "abcd";
String s2 = "bcm";

第一次循环初始化时:(X = 0;  Y = 0;  Z = s2.length()-x = 3)
第14行“for”第一次:String temp = s2.substring(y,z) = "bcm"//这是伪代码
第18行“if”判断失败,回到14行“for”
——————
第14行“for”第二次:这个时候(X = 0;  Y = 1;  Z = 4)显然之前的z++让Z在现在为4,是不正确的。
回到第12行的第一层for循环。

之前我也有疑问这个设定的问题,后来分析发现,不管是S2中的何种子串,即使是单一字符的子串,都会在最后一次for循环中查找到(最坏情况)。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马