黑马程序员技术交流社区

标题: 字符串中的疑问: [打印本页]

作者: 李万海    时间: 2013-3-13 21:48
标题: 字符串中的疑问:
  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来控制循环结束?
作者: 孙娜    时间: 2013-3-14 12:53
z=s2.length()-x;这里是初始化z的值,只在内循环每次开始的时候执行一次;z++是每次内循环都要执行的。也就是说每次内循环开始都给z赋值(这个值是随着外层x的增加而递减),然后开始内循环,循环一次z++执行一次,直到z!=s2.length()+1为false结束。如果不用z!=s2.length()+1控制循环结束,s2.substring(y,z)取字符串时就会超出角标范围报错。
作者: 陈腾跃_2013    时间: 2013-3-14 18:33
本帖最后由 陈腾跃_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循环中查找到(最坏情况)。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2