题目描述
说明
最长公共子序列的定义:
最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
en.wikipedia.org/wiki/Longes…
样例
给出”ABCD” 和 “EDCA”,这个LCS是 “A” (或 D或C),返回1
给出 “ABCD” 和 “EACB”,这个LCS是”AC”返回 2
解题思路
动态规划法,状态方程dp[i][j]表示 长度为i+1的字符串A ,j+1 的字符串B 的LCS 长度。
如果 A[i]=B[j]
dp[i][j]=dp[i-1][j-1]+1
否则
dp[i][j]=Max(dp[i-1][j],dp[i][j-1])
程序实现
public class Solution {
/*
* @param A: A string
* @param B: A string
* @return: The length of longest common subsequence of A and B
*/
public int longestCommonSubsequence(String A, String B) {
if(A==null||A.length()==0||B==null||B.length()==0)
return 0;
char[] chA=A.toCharArray();
char[] chB=B.toCharArray();
int m=A.length();
int n=B.length();
int[][]dp=new int[m+1][n+1];
//dp[i][j] 表示A[0...i-1] B[0...j-1] 的公共最长子序列
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(chA[i-1]==chB[j-1])
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[m][n];
}
}