简介: 一个给定序列的子序列,是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子序列(Longest Common Subsequence,LCS)是长度最长的子序列。
算法思想: 使用动态规划求解,引入二维数组dp,dp[i][j]存储的是序列Xi(x1,x2,…xi)和Yj(y1,y2,…yi)的最长公共子序列的长度,递归关系如下:
dp[0][j] = 0,dp[i][0] = 0;
dp[i][j] = dp[i-1][j-1] + 1,xi = yj;
dp[i][j] = max(dp[i-1][j] , dp[i][j-1]),xi != yj;
public static int LCS(String X,String Y){
int n,m;
if (X == null || Y == null || (n = X.length()) == 0 || (m = Y.length()) == 0)
return 0;
int[][] dp = new int[n+1][m+1];
char xi,yi;
for (int i = 1;i <= n;i++){
xi = X.charAt(i-1);
for (int j = 1;j <= m;j++){
yi = Y.charAt(j-1);
if (xi==yi)
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[n][m];
}