给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。
- 说明样例
最长公共子序列的定义:
- 最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
- https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1
- 最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2
- 假设 Z=<z1,z2,⋯,zk> 是 X 与 Y 的LCS, 我们观察到 。如果 xm=yn ,则 zk=xm=yn ,有 Zk−1 是 Xm−1 与 Yn−1 的LCS;
- 如果 xm≠yn 则 Zk 是 Xm 与 Yn−1 的LCS,或者是 Xm−1 与 Yn 的LCS。
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 m = A.length()+1;
int n = B.length()+1;
if(m == 1 || n == 1)
return 0;
int **arr;
arr = new int*[n];
for(int i = 0; i < n; i++)
{
arr[i] = new int[m];
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
arr[i][j] = 0;
}
int maxNum = 0;
for(int i = 1; i < n; i++)
for(int j = 1; j < m; j++)
{
if(A[i-1] == B[j-1])
arr[i][j] = arr[i-1][j-1]+1;
else
arr[i][j] = max(arr[i][j-1],arr[i-1][j]);
if(maxNum < arr[i][j])
maxNum = arr[i][j];
}
for(int i = 0; i < n; i++)
delete[] arr[i];
delete[] arr;
return maxNum;
}
int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
};