LintCode:79. 最长公共子串 VS 77. 最长公共子序列

最长公共子串与最长公共子序列的主要区别在于一个必须是连续的另一个则不一定。

最长公共子串:

题目:给出两个字符串,找到最长公共子串,并返回其长度。

LintCode:79. 最长公共子串 VS 77. 最长公共子序列_第1张图片

分析:这是一个经典的动态规划题,定义dp矩阵,dp[i][j]表示A串匹配到i,B串匹配到j时的最大公共长度。

        dp有A.length()+1行,有B.length()列。第一行与第一列都为0;

        有状态转移方程

                    dp[i][j]=dp[i-1][j-1]+1      ,A[i]==B[j]

                    dp[i][j]=0                        ,A[i]!=B[j]

        最后返回dp的最大值即为最长公共子串长度。

public class Solution {
    /**
     * @param A: A string
     * @param B: A string
     * @return: the length of the longest common substring.
     */
    public int longestCommonSubstring(String A, String B) {
        // write your code here
        if(A.length()==0||B.length()==0)    return 0;
        int[][] dp=new int[A.length()+1][B.length()+1];   //dp[i][j]表示A字符串匹配到i,B字符串匹配到j时的最大长度;
        int maxLength=0;
        for(int i=1;i<=A.length();i++){
            for(int j=1;j<=B.length();j++){
                if(A.charAt(i-1)==B.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=0;
                }
                if(dp[i][j]>maxLength){
                    maxLength=dp[i][j];
                }
            }
        }
        return maxLength;
    }
}


最长公共子序列:

题目:给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。

LintCode:79. 最长公共子串 VS 77. 最长公共子序列_第2张图片

分析:最长公共子序列与最长公共子串的区别在于最长公共子序列不需要连续的子串。

         定义矩阵c[i][j],表示表示A串匹配到i,B串匹配到j时的最大公共长度。

有状态转移方程:

最后返回c的最大值即为最长公共子序列长度。

public class Solution {
    /**
     * @param A: A string
     * @param B: A string
     * @return: The length of longest common subsequence of A and B
     */
    public int longestCommonSubsequence(String A, String B) {
        // write your code here
        if(A.length()==0||B.length()==0)    return 0;
        int[][] dp=new int[A.length()+1][B.length()+1];   //dp[i][j]表示A字符串匹配到i,B字符串匹配到j时的最大长度;
        int maxLength=0;
        for(int i=1;i<=A.length();i++){
            for(int j=1;j<=B.length();j++){
                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-1][j],dp[i][j-1]);
                }
                if(dp[i][j]>maxLength){
                    maxLength=dp[i][j];
                }
            }
        }
        return maxLength;
    }
}

你可能感兴趣的:(动态规划,LintCode)