上一篇我们总结了两个字符串的一个最长操作——最长公共连续子串,现在我们来总结下另外一个最长——最长公共子序列,这个和上一个的区别在于,它不用要求子序列连续。

这个是DP的典型题,

子字符串的最优解为字符串提供了决策依据。有两个字符串s和p,设dp[i,j]为子串s[0-i]和p[0-j]的最长公共子序列的长度,

  如果s[i]=p[j],则dp[i,j]=dp[i-1,j-1]+1;

  如果s[i]!=p[j],则dp[i,j]要么等于s[0,i-1]和p[0,j]的最长公共子序列的长度,要么等于s[0,i]和p[0,j-1]的最长公共子序列的长度,取两者的最大值即是dp[i,j]

初始值:dp[0][0]=0,dp[0][j]=0,dp[i][0]=0

int lcs(string s, string p) {
    int len1 = s.length();
    int len2 = p.length();
    int dp[][] = new int[len1+1][len2+1];
    for (int i = 0; i <= len1; i++)
    {
        for( int j = 0; j <= len2; j++) 
        {
            if(i == 0 || j == 0) 
            {
                dp[i][j] = 0;
            }
             else if (s.[i-1] == p[j-1]) 
            {
                dp[i][j] = c[i-1][j-1] + 1;
            } 
            else 
            {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    return dp[len1][len2];
}        

 

posted on 2018-05-30 11:50  Mini_Coconut  阅读(127)  评论(0编辑  收藏  举报