給出兩個字符串,找到最長公共子序列(LCS),返回LCS的長度。html
說明
最長公共子序列的定義:
最長公共子序列問題是在一組序列(一般2個)中找到最長公共子序列(注意:不一樣於子串,LCS不須要是連續的子串)。該問題是典型的計算機科學問題,是文件差別比較程序的基礎,在生物信息學中也有所應用。
https://en.wikipedia.org/wiki/Longest_common_subsequence_problem數組樣例
給出"ABCD" 和 "EDCA",這個LCS是 "A" (或 D或C),返回1
給出 "ABCD" 和 "EACB",這個LCS是"AC"返回 2ui標籤
動態規劃 LintCode 版權全部 最長公共子串.net
參考博客http://blog.chinaunix.net/uid-26548237-id-3374211.html
利用二維數組記錄信息:
若字符串A和字符串B長度分別爲m和nunix
class Solution { public: /** * @param A, B: Two strings. * @return: The length of longest common subsequence of A and B. */ int longestCommonSubsequence(string A, string B) { // write your code here int sizeA = A.size(), sizeB = B.size(), i = 0, j = 0; int maxLen = 0; if(sizeA <= 0 || sizeB <= 0) { return 0; } vector<vector<int> > dpMatrix; dpMatrix.resize(sizeA+1); for(i=0; i<=sizeA; i++) { dpMatrix[i].resize(sizeB+1); } for(i=0; i<=sizeA; i++) { for(j=0; j<=sizeB; j++) { dpMatrix[i][j] = 0; } } for(i=1; i<=sizeA; i++) { for(j=1; j<=sizeB; j++) { if(A[i-1] == B[j-1]) { dpMatrix[i][j] = dpMatrix[i-1][j-1] + 1; } else { dpMatrix[i][j] = dpMatrix[i-1][j] > dpMatrix[i][j-1] ? dpMatrix[i-1][j] : dpMatrix[i][j-1]; } maxLen = maxLen >= dpMatrix[i][j] ? maxLen : dpMatrix[i][j]; } } return maxLen; } };