lintcode--最长公共子序列

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

说明

最长公共子序列的定义:

  • 最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
  • https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
样例

给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1

给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2






/*
设两个字符串是A、B ,其长度是lenA、lenB 定义数组Arr[lenA+1][lenB+1] ,Arr[i][j] 表示A[0--i] ,B[0--j] 两个字符串的最长公共子序列长度,对下面的一个位置 i+ 1 、j+ 1


1.若A[i+1] == B[j+1], 则Arr[i+1][j+1] = Arr[i][j] + 1


2.若A[i+1]!=B[j+1],Arr[i+1][j+1] 应该是根据其前面一个元素的值确定的,这里是个矩阵其前面的元素是Arr[i][j],Arr[i+1][j],Arr[i][j+1]


Arr[i][j]表示A[0--i] ,B[0--j] 两个字符串的最长公共子序列长度


Arr[i+1][j]表示A[0--i+1] ,B[0--j] 两个字符串的最长公共子序列长度


Arr[i][j+1]表示A[0--i] ,B[0--j+1] 两个字符串的最长公共子序列长度


A[i+1]!=B[j+1], 可能A[i+1]==B[j]  A[i]==B[j+1]  这里是交叉相等的情况所以Arr[i+1][j+1] =max(Arr[i+1][j],Arr[i][j+1])


同时要注意:数组Arr长度是lenA+1 lenB+1 第一行第一列的元素都是0 这样在求解的时候比较方便
*///博客
public class Solution {
    public int longestCommonSubsequence(String A, String B) {
        // write your code here
        int alen = A.length();
        int blen = B.length();
        int[][]dp = new int[alen+1][blen+1];
        for(int i=1;i<=alen;i++){//注意i<=alen;
            for(int j =1;j<=blen;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]);
                }
            }
        }
        return dp[alen][blen];
    }
}


你可能感兴趣的:(lintcode)