原题链接在这里:http://www.lintcode.com/en/problem/longest-common-subsequence/
题目:
Given two strings, find the longest common subsequence (LCS).
Your code should return the length of LCS.
What's the definition of Longest Common Subsequence?
For "ABCD"
and "EDCA"
, the LCS is "A"
(or "D"
, "C"
), return 1
.
For "ABCD"
and "EACB"
, the LCS is "AC"
, return 2
.
题解:
DP. 参考http://www.geeksforgeeks.org/dynamic-programming-set-4-longest-common-subsequence/
dp[i][j]表示长度为i的str1 和 长度为j的str2 LCS长度.
若是str1.charAt(i-1) == str2.charAt(j-1) 尾字符相同, dp[i][j] = dp[i-1][j-1]+1.
若是不同dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]).
举例: 1. "AGGTAB" and "GXTXAYB". Last characters match for the strings. So length of LCS can be written as:
L("AGGTAB", "GXTXAYB") = 1 + L("AGGTAB", "GXTXAYB")
2. "ABCDGH" and "AEDFHR". Last characters do not match for the strings. So length of LCS can be written as:
L("ABCDGH","AEDFHR") = MAX ( L("ABCDG", "AEDFHR"), L("ABCDGH", "AEDFH")).
Time Complexity: O(m*n). Space: O(m*n).
AC Java:
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) {
if(A == null || B == null){
return 0;
}
int m = A.length();
int n = B.length();
int [][] dp = new int[m+1][n+1];
for(int i = 1; i<=m; i++){
for(int j = 1; j<=n; j++){
//两个末尾char match, 数目就是dp[i-1][j-1]+1
if(A.charAt(i-1) == B.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
}
}
}
return dp[m][n];
}
}