给出两个字符串,找到最长公共子序列(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; } };