我的思想是遍历两个字符串,使用临时的stringbuffer存储查找过程中找到的子字符串,然后保存起来,一轮查找完成后,就和上次的保存的子字符串的长度进行比较,如果长,就更新保存的临时stringbuffer。此题要非常注意字符串的下标越界的情况发生。
package 求两个字符串之间的最长公共子串;
public class Test3 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String s1="adsjfjkhjfeefe";
//s1="shaohui";
String s2="huioiuyjifeefedwi";
//s2="ahui";
if(s1.length()<s2.length()){//前一个字符串长度小于后一个的情况,则交换
String s=s1;
s1=s2;
s2=s;
}
String s=fun(s1,s2);
System.out.println(s);
}
private static String fun(String s1, String s2) {
// TODO 自动生成的方法存根
if(s1==null||s2==null)
return null;
if(s1.length()==0||s2.length()==0)
return null;
int i,j,k=0;
StringBuffer sb=new StringBuffer();
StringBuffer sbTemp=new StringBuffer();
int max=0;
for(i=0;i<s1.length();i++)
for(j=0;j<s2.length();j++){
while(s1.charAt(i+k)==s2.charAt(j+k)){//此处注意下标越界
sbTemp.append(s1.charAt(i+k));
if(i+k<s1.length()-1&&j+k<s2.length()-1){//此处注意下标越界
k++;
}
else
{
break;
}
}
if(max<sbTemp.length()){
max=sbTemp.length();
sb.delete(0, sb.length());//sb清空
sb.append(sbTemp.toString());
}
k=0;
sbTemp.delete(0, sbTemp.length());//sbTemp重新清空
}
return sb.toString();
}
}