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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭利超 高级黑马   /  2013-3-18 22:54  /  1641 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭利超 于 2013-3-19 08:05 编辑
  1. /*
  2. 4,获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印。
  3. "abcwerthelloyuiodef"
  4. "cvhellobnm"
  5. 思路:
  6. 1,将短的那个子串按照长度递减的方式获取到。
  7. 2,将每获取到的子串去长串中判断是否包含,
  8. 如果包含,已经找到!。
  9. */

  10. class StringTest3
  11. {
  12. /*
  13. 练习四。
  14. */
  15. public static String getMaxSubString(String s1,String s2)
  16. {

  17. String max = "",min = "";

  18. max = (s1.length()>s2.length())?s1: s2;

  19. min = (max==s1)?s2: s1;

  20. // sop("max="+max+"...min="+min);
  21. for(int x=0; x<min.length(); x++)
  22. {
  23. for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
  24. {
  25. String temp = min.substring(y,z);

  26. sop(temp);
  27. if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
  28. return temp;
  29. }
  30. }
  31. return "";
  32. }


  33. public static void main(String[] args)
  34. {
  35. String s1 = "ab";
  36. String s2 = "cvhellobnm";
  37. sop(getMaxSubString(s2,s1));
  38. }

  39. public static void sop(String str)
  40. {
  41. System.out.println(str);
  42. }
  43. }
复制代码
下面的语句该怎么读(运行过程)
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
   {
    String temp = min.substring(y,z);

还有最后为什么需要返回 return "";
拜托大神了

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
自己占沙发 然后睡觉啦! 大神辛苦!
回复 使用道具 举报
本帖最后由 HM朱俊 于 2013-3-18 23:27 编辑

for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
   {
    String temp = min.substring(y,z);
是选取min字符串中从y角标到z角标的子字符串。所以for循环刚开始时是从y=0也就是从头开始取到z=length()-x结束,而外层for循环刚开始时是x=0,那么内层循环z的值其实就是该字符串的总长度,即取得是他本身,循环一遍后,然后y++,z++,而z++条件不满足,内循环结束。紧接着外循环x++,内循环里去的值就是min字符串总长度少一位的两个子字符串,然后依次,外循环转一圈,内循环就取出min字符串总长度少一位的子字符串。直到取完所有的子字符串。
返回return是因为该方法前有String类型标识,所以需要返回值。但是在for循环中已经返回了需要的字符串,所以外面返回一个空值就可以了。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
        for (int y = 0, z = min.length() - x; z != min.length() + 1; y++, z++) {
                                /*
                                 *         下面是列的内循环的流程。
                                 * 1. y=0,
                                 * 2. z=min.length()-x  //用来每进行一次外循环,最小的字符串长度减1;
                                 * 3. String temp = min.substring(y, z); //第一次从字符串中取出min.substring(0,3),所以取出来还是“ab”。
                                 * 4. sop(temp);
                                 * 5. if()
                                 * 6. z != min.length() + 1; //主要用于控制min.substring(y,z);因为这个方法再取子串的时候,
                                 *                                                                 是包括头,不包括尾的,
                                 * 7. y++   
                                 * 8 .z++
                                 * 9 重复上面的流程, 直到第一次比较结速。
                                 * */
还有最后为什么需要返回 return "";?
是因为你的方法必须返回一个字符串,当你的最大子串不存在的时候,你只能返回一个空来占位。
回复 使用道具 举报
因为你的方法 public static String getMaxSubString(String s1,String s2){} 要求返回值为String.虽然在for循环中已经 return temp;但是,如果你不返回return "";编译器是不会通过编译的.
为什么呢?因为对编译器来说,它只看语法,它要确定你有返回值,这是从安全的角度考虑的.
来看你的代码:
for(int x=0; x<min.length(); x++)
{
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
{
String temp = min.substring(y,z);

sop(temp);
if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
return temp;
}
}
return "";
}
for循环中的return temp 是写在if后的,编译器不能确定这个return是否一定会被执行,所以你需要给它一个确定的返回值.而我们自己知道已经返回了一个temp,所以需要return一个"";来通过编译.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马