LintCode Longest Common Subsequence

≡放荡痞女 提交于 2020-01-10 15:30:10

原题链接在这里: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.

Clarification
Example

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:

 1 public class Solution {
 2     /**
 3      * @param A, B: Two strings.
 4      * @return: The length of longest common subsequence of A and B.
 5      */
 6     public int longestCommonSubsequence(String A, String B) {
 7         if(A == null || B == null){
 8             return 0;
 9         }
10         int m = A.length();
11         int n = B.length();
12         int [][] dp = new int[m+1][n+1];
13         for(int i = 1; i<=m; i++){
14             for(int j = 1; j<=n; j++){
15                 //两个末尾char match, 数目就是dp[i-1][j-1]+1
16                 if(A.charAt(i-1) == B.charAt(j-1)){
17                     dp[i][j] = dp[i-1][j-1]+1;
18                 }else{
19                     dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]);
20                 }
21             }
22         }
23         return dp[m][n];
24     }
25 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!