转至:http://blog.csdn.net/earbao/article/details/50424948
这篇文章讲的听清楚了,根据他的思路,我自己写了一遍代码,并放弃考虑有多个答案的情况。
public class Lcs {
public static String longest(String s1,String s2){
char ch1[]=s1.toCharArray();
char ch2[]=s2.toCharArray();
int length1=ch1.length;
int length2=ch2.length;
/*
这里其实还可以考虑一下那个数组较长,在下面创建mat数组时可以节省一点空间,在两个数组长度相差较大时能节省较多空间。
*/
int max=0;
int sign=0;
int[] mat=new int[length1];
for(int i=0;i<length2;i++){
for(int j=length1-1;j>=0;j--){
if(ch2[i]==ch1[j]){
if(i==0 || j==0){
mat[j]=1;
if(max==0){
max=1;
sign=j;
}
}
else{
mat[j]=mat[j-1]+1;
if(mat[j]>max){
max=mat[j];
sign=j;
}
}
}
else{
mat[j]=0;
}
}
}
return new String(ch1, sign-max+1, max);
}
public static void main(String[] args) {
String s1="erecadhssjdgd";
String s2="abcadhssjda";
System.out.println(longest(s1, s2));
}
}