LintCode Longest Common Subsequence

Posted Dylan_Java_NYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode Longest Common Subsequence相关的知识,希望对你有一定的参考价值。

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

 

以上是关于LintCode Longest Common Subsequence的主要内容,如果未能解决你的问题,请参考以下文章

Lintcode077.Longest Common Subsequence

lintcode-medium-Longest Palindromic Substring

SPOJ 1812 Longest Common Substring II

Longest Common Substring(最长公共子序列)

Leetcode 之Longest Common Prefix(34)

●SPOJ 1811 Longest Common Substring