題目
給出兩個(gè)字符串,找到最長(zhǎng)公共子序列(LCS)抠忘,返回LCS的長(zhǎng)度。
說明
最長(zhǎng)公共子序列的定義:
- 最長(zhǎng)公共子序列問題是在一組序列(通常2個(gè))中找到最長(zhǎng)公共子序列(注意:不同于子串,LCS不需要是連續(xù)的子串)享言。該問題是典型的計(jì)算機(jī)科學(xué)問題锈遥,是文件差異比較程序的基礎(chǔ)纫事,在生物信息學(xué)中也有所應(yīng)用。
- https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
樣例
給出"ABCD" 和 "EDCA"所灸,這個(gè)LCS是 "A" (或 D或C)丽惶,返回1
給出 "ABCD" 和 "EACB",這個(gè)LCS是"AC"返回 2
分析
典型的動(dòng)態(tài)規(guī)劃問題
dp[i][[j]:表示前i個(gè)和前j個(gè)字符最大LCS
當(dāng)A[i] = B[i]的時(shí)候:
那么顯然dp[i][j] = dp[i-1][j-1] + 1,因?yàn)閐p[i-1][j-1]就是前最大的情況
當(dāng)A[i] != B[i]:
dp[i][j] = max(dp[i][j-1],dp[i-1][j])
初始條件很簡(jiǎn)單爬立,顯然ii,j有一個(gè)為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];
}
}