和最大公共子序列类似,都是采用的是动态规划,不同的是,连续的串不需要判断不相等情况下的求最大,只需要判断相等即可,然后更新最大长度和每个序列的起始位置。
package stringTest;
/**
* 最大公共子串
* @author duola
*
*/
public class lcs2 {
public static String lcs2(String s1,String s2) {
if(s1==""||s2==""||s1.length()<=0||s2.length()<=0) return "";
int [][]c=new int[s1.length()+1][s2.length()+1];
int max=0,m=0,n=0;
for(int i=s1.length()-1;i>=0;i--){
for(int j=s2.length()-1;j>=0;j--){
if(s1.charAt(i)==s2.charAt(j)){
c[i][j]=c[i+1][j+1]+1;
}
if(c[i][j]>max){
max=c[i][j];
m=i;
n=j;
}
}
}
System.out.println("最大子串的长度是:"+max);
StringBuilder sb=new StringBuilder();
for(int i=m,j=n;i<s1.length()&&j<s2.length();i++,j++){
if(c[i][j]>0){
sb.append(s1.charAt(i));
}
}
return sb.toString();
}
public static void main(String [] args) {
String s1="abcdfrgrgr";
String s2="sbcdfjksjdksgrgjk";
System.out.print("最大的公共子串是"+lcs2(s1,s2));
}
}
需要注意的是输出的是最后一个最大公共子串,因为最大公共子串可能有多个。