黑马程序员技术交流社区

标题: 获取两个字符串中最大相同的子串——总结 [打印本页]

作者: newlaw2013    时间: 2012-4-9 21:27
标题: 获取两个字符串中最大相同的子串——总结
今天论坛有几个帖子是关于这个问题的,下面把自己的总结发出来,同大家共享:
  1. /*
  2. 需求:获取两个字符串中最大相同的子串。
  3. 思路:选取两个字符串中长度短的定义为min,遍历min中的子字符串(从最大长度开始),并判断长字符串max中是否包含这些子字符串。
  4.       如果包含则将它存入al集合中。如果遍历完毕没有符合要求的字符串,则输出没有找到相同字符串的提示语句。
  5. -----------
  6. ★说明★:
  7. 需求:在没有找到相同字符串时应打印提示语句:sop(s1+"和"+s2+"两者之间没有相同的子串!")。那么如何加入该语句呢?
  8. 一、位置◎:放在该位置的话,因为内层的for循环是遍历min字符串中所有的子串,
  9.     如果min长度为n,那么这个语句将会执行n*(n+1)/2遍。即min所有子串以及它本身的个数总和。
  10. 二、位置△:放在该位置,如果min中没有一个子串在max中,那么打印的次数是外层for循环的次数。实际这里打印的次数与相同的
  11.     子串个数有关。按某一长度找不到相同的,就打印一次,如果找到相同的最大子串长度是len,那么打印次数是min.length()-len+1。
  12. 三、应该放在位置◇。下面的代码注释有解释。
  13. -----------
  14. ★说明★
  15.   if(!al.isEmpty())
  16.          break;
  17. 该语句对返回最大相同的字符串至关重要。因为内层的for循环是先查找长度最大的字符串,即长度为min.length()的字符串。
  18. 如果没有找到,则返回上一层for循环,这时x自增加1,到内层for循环,查找min.length()-1的字符串。这样循环下去,查找的
  19. 字符串长度逐级减小,直到单个字符查找结束。
  20.      如果找到了相同子符串,则集合al就不再是Empty,当程序想到外层for循环让x自增、继续查找长度小一级的相同字符串时,
  21. 碰到了该if语句,break跳出了!下面的循环都不会再执行,就好像集合al带着最先找到的相同字符串(当然也是最大的)离开
  22. for循环,去执行main函数中的语句了。
  23. -----------
  24. ★编译提示★ 不知道如何将下面的提示消除。
  25. D:\>javac StringTest3.java
  26. 注: StringTest3.java使用了未经检查或不安全的操作。
  27. 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
  28. */
  29. import java.util.*;

  30. class  StringTest3
  31. {
  32.         public static ArrayList getMaxSubString(String s1,String s2)
  33.         {
  34.                 String max = "",min = "";

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

  36.                 min = (max==s1)?s2: s1;
  37.                 ArrayList<String> al = new ArrayList<String>();
  38.                
  39.                 for(int x=0; x<min.length(); x++)
  40.                 {
  41.                        
  42.                         if(!al.isEmpty())//该判断语句很重要,文件开始的说明。
  43.                                  break;
  44.                         //△else
  45.                                 //sop(s1+"和"+s2+"两者之间没有相同的子串!");
  46.                         for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
  47.                         {
  48.                                 String temp = min.substring(y,z);
  49.                                
  50.                                 if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
  51.                                         al.add(temp);   
  52.                                 //else
  53.                                         //◎sop(s1+"和"+s2+"两者之间没有相同的子串!");       
  54.                         }
  55.                   
  56.             }
  57.                 return al;//作为getMaxSubString()方法的返回结果。
  58.         }

  59.         public static void main(String[] args)
  60.         {
  61.                 //String s1 = "abcdefghijklmnopqrstuvwxyz";
  62.                 //String s2 = "abcdefgkkktuvwxyz";
  63.                 String s1 = "hellohello";
  64.                 String s2 = "gelkl";
  65.                 ArrayList<String> arr =getMaxSubString(s2,s1);
  66.                 //◇这里没有对arr进行判断,就进行迭代了。如果arr中没有元素。则迭代不出任何结果,
  67.                 //而且控制台也不打印任何提示就结束了。显然这是不合适的.所以在进行迭代之前,对arr集
  68.                 //合进行是否为空的判断,如果没有元素,就打印如下语句:
  69.                 if (arr.isEmpty())
  70.                 {
  71.                         sop(s1+"和"+s2+"两者之间没有相同的子串!");
  72.                         return;
  73.                 }
  74.                 else
  75.                 sop(s1+"和"+s2+"最大相同的子串是:");
  76.                 Iterator<String> it = arr.iterator();
  77.                 while(it.hasNext()){
  78.                                 sop(it.next());
  79.                 }           
  80.         }

  81.         public static void sop(Object str)
  82.         {
  83.                 System.out.println(str);
  84.         }
  85. }


复制代码





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