題目
給出兩個字符串,找到最長公共子序列(LCS),返回LCS的長度。
說明
最長公共子序列的定義:
- 最長公共子序列問題是在一組序列(通常2個)中找到最長公共子序列(注意:不同于子串,LCS不需要是連續的子串)。該問題是典型的計算機科學問題,是文件差異比較程序的基礎,在生物信息學中也有所應用。
- https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
樣例
給出"ABCD" 和 "EDCA",這個LCS是 "A" (或 D或C),返回1
給出 "ABCD" 和 "EACB",這個LCS是"AC"返回 2
分析
典型的動態規劃問題
dp[i][[j]:表示前i個和前j個字符最大LCS
當A[i] = B[i]的時候:
那么顯然dp[i][j] = dp[i-1][j-1] + 1,因為dp[i-1][j-1]就是前最大的情況
當A[i] != B[i]:
dp[i][j] = max(dp[i][j-1],dp[i-1][j])
初始條件很簡單,顯然ii,j有一個為0,dp都是0
代碼
public class Solution {
/**
* @param A, B: Two strings.
* @return: The length of longest common subsequence of A and B.
*/
public int longestCommonSubsequence(String A, String B) {
int n = A.length();
int m = B.length();
int[][] dp = new int[n+1][m+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
if(A.charAt(i-1) == B.charAt(j-1))
dp[i][j] = dp[i-1][j-1] + 1;
}
return dp[n][m];
}
}