1、最长公共子串与最长公共子序列的区别?
最长公共子序列在原序列中不要求连续,而最长公共子串要求在原序列中是连续的。
分析:求两个子串x(x[0],x[1],……,x[n-1]),y(y[0],y[1],……,y[m-1])的最长公共子串,令dp[i][j]表示以x[i-1],y[j-1]结尾的最长公共子串的长度。则可以得出转态转移方程:
import java.util.Scanner;
//s1,s2最长公共子串
public class LCS2
{
static int dp[][];//dp[i][j]:以s1[i-1],s2[j-1]结尾的最长公共子串的长度
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while(in.hasNext())
{
String s1=in.next();
String s2=in.next();
dp=new int[s1.length()+1][s2.length()+1];
String resut=lcs(s1, s2);
System.out.println(resut);
}
}
static public String lcs(String s1,String s2)
{
int n=s1.length();
int m=s2.length();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s1.charAt(i-1)==s2.charAt(j-1))
{
dp[i][j]=dp[i-1][j-1]+1;
}else
{
dp[i][j]=0;
}
}
}
int max=0;
int end=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(max<dp[i][j])
{
max=dp[i][j];
end=i;
}
}
}
if(max>0){
return s1.substring(end-max,end);
}
return "";
}
}