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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李蛟龙 中级黑马   /  2012-4-23 14:58  /  2295 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package Test;
public class StringTest3 {
//两个字符串中最大相同的子串。

  public static void main(String[] args) {
   String str = "ahdskjalksdg";
   String str1 = "skjalksdgfsajflskj";
   String string = getSubString(str,str1);
   System.out.println(string);
   
  }
  public static String getSubString(String str, String str1) {
   String max = null,min = null;
   //判断哪个字符串长,哪个短
   max =(str.length()>str1.length())?str:str1;
   min = max.equals(str)?str1:str;
   //遍历字符串
   for(int i=0; i<max.length();i++){
    for (int x=0, y = max.length()-i; y <min.length()+1;x++,y++) {
     String sub = min.substring(x,y);
     //判断获得字符串是包涵与最大字符串中,则返回字符串
     if (max.contains(sub)) {
      return sub;
     }
    }
   }
   /*for(int x=0;x<min.length();x++){
    for(int y=min.length();y>x;y--){
     String sub = min.substring(x,y);
     if (max.contains(sub)) {
      return sub;
     }
    }
     */
     
   
  
   return null;
   }
  }
代码中  for (int x=0, y = max.length()-i; y <min.length()+1;x++,y++)
Y的初始值为什么是max.length()-i,且后面还要y++

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

2 个回复

正序浏览
Y的初始值为什么是max.length()-i,且后面还要y++
--------------------------------------------------------
先弄明白程序是如何比较的,就是要弄清楚算法,
画了该代码的图并附上代码,供参考:
  1. public class StringTest3a
  2. {
  3. public static void main(String[] args)
  4. {
  5. String str = "ahdskjalksdgkk";//14个字符
  6. String str1 = "skjalksdgfsajflskj";//18个字符
  7. String string = getSubString(str,str1);
  8. System.out.println(string);

  9. }
  10. public static String getSubString(String str,String str1)
  11. {
  12. String max = null,min = null;

  13. //如下的判断语句,当str和str1的长度相等时,max=str1,min=str;
  14. max = (str.length()>str1.length())?str:str1;
  15. min = max.equals(str)?str1:str;
  16. //-----------------------
  17. for(int i=0;i<max.length();i++)
  18. {
  19. System.out.println("第 "+i+" 次循环结果:");
  20. int innerCount=1;
  21. for(int x=0,y=max.length()-i;y<min.length()+1;x++,y++)
  22. {
  23. System.out.println("开始内循环----"+innerCount);
  24. String sub = min.substring(x,y);
  25. if(max.contains(sub))
  26. {
  27. System.out.println("此时y等于:"+y+" 返回字符串的长度是: "+sub.length());
  28. return sub;
  29. }
  30. innerCount++;
  31. }

  32. }
  33. /*★★★★★---------------
  34. for(int x=0;x<min.length();x++)
  35. {
  36. for(int y=min.length();y>x;y--)
  37. {
  38. String sub = min.substring(x,y);
  39. if(max.contains(sub))
  40. {
  41. return sub;
  42. }
  43. }
  44. }
  45. ★★★★★-------------------*/
  46. return null;
  47. }

  48. }
  49. /*
  50. 运行结果:
  51. D:\>java StringTest3a
  52. 第 0 次循环结果:
  53. 第 1 次循环结果:
  54. 第 2 次循环结果:
  55. 第 3 次循环结果:
  56. 第 4 次循环结果:
  57. 开始内循环----1
  58. 第 5 次循环结果:
  59. 开始内循环----1
  60. 开始内循环----2
  61. 第 6 次循环结果:
  62. 开始内循环----1
  63. 开始内循环----2
  64. 开始内循环----3
  65. 第 7 次循环结果:
  66. 开始内循环----1
  67. 开始内循环----2
  68. 开始内循环----3
  69. 开始内循环----4
  70. 第 8 次循环结果:
  71. 开始内循环----1
  72. 开始内循环----2
  73. 开始内循环----3
  74. 开始内循环----4
  75. 开始内循环----5
  76. 第 9 次循环结果:
  77. 开始内循环----1
  78. 开始内循环----2
  79. 开始内循环----3
  80. 开始内循环----4
  81. 此时y等于:12 返回字符串的长度是: 9
  82. skjalksdg
  83. */
复制代码

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 杨国祯 于 2012-4-23 15:50 编辑

给你这个例子把里面注释很详细 这里给你的的还是一个调试方法,注意看结果,代码中间给你穿插了打印方法
public staticString getSubString(String str, String str1)
           {
              Stringmax = null,min = null;
              max= (str.length() > str1.length()) ? str : str1;//"skjalksdgfsajflskj"
              min= max.equals(str) ? str1 : str;//"ahdskjalksdg"
              for (int i = 0; i <max.length(); i++)
                  {

                     System.out.println("" + i + "次循环" +"i="+i);
不知道你这是哪里的代码,但是很显然的是,这是你自己构建了一种情况,目的是截取自己想要的特定字符串
问题一:为什么 y = max.length()-i 因为max.length() 是18,而条件min.length()+1是13,y不减去 i 的话嵌套的for里面的语句就执行不到
                     for (int x = 0, y = max.length()- i;    y < min.length() + 1;    x++, y++)
                         {System.out.println("内循环第" + y + "次循环" +"y="+y);
                            Stringsub = min.substring(x, y);
                            if (max.contains(sub))// 判断获得字符串是包涵与最大字符串中,则返回字符串
                                {
                                   return sub;
                                }
                         }
                  }
问题二: 为什么要y++呢,因为y是一个判断的条件,而你这里只有在y小于13的时候才会循环,找到循环的时候y++能够在符合条件的情况下多循环几次
第0次循环i=0
第1次循环i=1
第2次循环i=2
第3次循环i=3
第4次循环i=4
第5次循环i=5
第6次循环i=6
开始内循环第y=12  刚开始是12 y++后 直接跳出
第7次循环i=7
开始内循环第y=11  后来是11,多执行了一次
开始内循环第y=12
第8次循环i=8
开始内循环第y=10  再往下很直接,里面终于出现了,满足你自己设置的条件的字符串
开始内循环第y=11
开始内循环第y=12
第9次循环i=9
开始内循环第y=9
开始内循环第y=10
开始内循环第y=11
开始内循环第y=12
skjalksdg                          你的代码想得到的字符串

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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