黑马程序员技术交流社区
标题:
获取两个字符串中最大相同的子串——总结
[打印本页]
作者:
newlaw2013
时间:
2012-4-9 21:27
标题:
获取两个字符串中最大相同的子串——总结
今天论坛有几个帖子是关于这个问题的,下面把自己的总结发出来,同大家共享:
/*
需求:获取两个字符串中最大相同的子串。
思路:选取两个字符串中长度短的定义为min,遍历min中的子字符串(从最大长度开始),并判断长字符串max中是否包含这些子字符串。
如果包含则将它存入al集合中。如果遍历完毕没有符合要求的字符串,则输出没有找到相同字符串的提示语句。
-----------
★说明★:
需求:在没有找到相同字符串时应打印提示语句:sop(s1+"和"+s2+"两者之间没有相同的子串!")。那么如何加入该语句呢?
一、位置◎:放在该位置的话,因为内层的for循环是遍历min字符串中所有的子串,
如果min长度为n,那么这个语句将会执行n*(n+1)/2遍。即min所有子串以及它本身的个数总和。
二、位置△:放在该位置,如果min中没有一个子串在max中,那么打印的次数是外层for循环的次数。实际这里打印的次数与相同的
子串个数有关。按某一长度找不到相同的,就打印一次,如果找到相同的最大子串长度是len,那么打印次数是min.length()-len+1。
三、应该放在位置◇。下面的代码注释有解释。
-----------
★说明★
if(!al.isEmpty())
break;
该语句对返回最大相同的字符串至关重要。因为内层的for循环是先查找长度最大的字符串,即长度为min.length()的字符串。
如果没有找到,则返回上一层for循环,这时x自增加1,到内层for循环,查找min.length()-1的字符串。这样循环下去,查找的
字符串长度逐级减小,直到单个字符查找结束。
如果找到了相同子符串,则集合al就不再是Empty,当程序想到外层for循环让x自增、继续查找长度小一级的相同字符串时,
碰到了该if语句,break跳出了!下面的循环都不会再执行,就好像集合al带着最先找到的相同字符串(当然也是最大的)离开
for循环,去执行main函数中的语句了。
-----------
★编译提示★ 不知道如何将下面的提示消除。
D:\>javac StringTest3.java
注: StringTest3.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
*/
import java.util.*;
class StringTest3
{
public static ArrayList getMaxSubString(String s1,String s2)
{
String max = "",min = "";
max = (s1.length()>s2.length())?s1: s2;
min = (max==s1)?s2: s1;
ArrayList<String> al = new ArrayList<String>();
for(int x=0; x<min.length(); x++)
{
if(!al.isEmpty())//该判断语句很重要,文件开始的说明。
break;
//△else
//sop(s1+"和"+s2+"两者之间没有相同的子串!");
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)
{
String temp = min.substring(y,z);
if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
al.add(temp);
//else
//◎sop(s1+"和"+s2+"两者之间没有相同的子串!");
}
}
return al;//作为getMaxSubString()方法的返回结果。
}
public static void main(String[] args)
{
//String s1 = "abcdefghijklmnopqrstuvwxyz";
//String s2 = "abcdefgkkktuvwxyz";
String s1 = "hellohello";
String s2 = "gelkl";
ArrayList<String> arr =getMaxSubString(s2,s1);
//◇这里没有对arr进行判断,就进行迭代了。如果arr中没有元素。则迭代不出任何结果,
//而且控制台也不打印任何提示就结束了。显然这是不合适的.所以在进行迭代之前,对arr集
//合进行是否为空的判断,如果没有元素,就打印如下语句:
if (arr.isEmpty())
{
sop(s1+"和"+s2+"两者之间没有相同的子串!");
return;
}
else
sop(s1+"和"+s2+"最大相同的子串是:");
Iterator<String> it = arr.iterator();
while(it.hasNext()){
sop(it.next());
}
}
public static void sop(Object str)
{
System.out.println(str);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2