算法序列——最长公共子序列

371 阅读1分钟

题目描述

说明
最长公共子序列的定义:

最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。
en.wikipedia.org/wiki/Longes…
样例
给出”ABCD” 和 “EDCA”,这个LCS是 “A” (或 D或C),返回1

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

解题思路

动态规划法,状态方程dp[i][j]表示 长度为i+1的字符串A ,j+1 的字符串B 的LCS 长度。
如果 A[i]=B[j]
dp[i][j]=dp[i-1][j-1]+1
否则
dp[i][j]=Max(dp[i-1][j],dp[i][j-1])

程序实现

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) {

       if(A==null||A.length()==0||B==null||B.length()==0)
            return 0;
        char[] chA=A.toCharArray();
        char[] chB=B.toCharArray();
        int m=A.length();
        int n=B.length();
        int[][]dp=new int[m+1][n+1];
        //dp[i][j] 表示A[0...i-1] B[0...j-1] 的公共最长子序列
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                if(chA[i-1]==chB[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[m][n];
    }
}