【动态规划】LeetCode 1143最长公共子序列_字符串处理

题目链接: 力扣 

思路:

动态规划:

dp[i][j]表示text1[0:i) 和 text2[0:j)的最长公共子序列的长度

      上述表示中,text1【0:i)的长度为i的前缀,text2【0:j)表示text2的长度为j的前缀

考虑动态规划的边界情况:

●当 i=0 时,text1[0:i)为空,空字符串和任何字符串的最长公共子序列的长度都是0,因此对任意

 0<=j<=n,dp[0][j]=0;

●当j=0时,text2[0:j)为空,同理可得,对任意0<=i<=m,有dp[i][0]=0

所以,当 i=0 或 j =0 时,dp[i][j]=0

当 i>0 且 j>0时,考虑dp[i][j]的计算

●当 text1[i-1]=text2[j-1]时,这两个相同的字符称为公共字符,考虑 text1[0:i-1]和text2[0:j-1]的最长公共子序列,再增加一个字符(即公共字符)即可得到text1[0:i]和text2[0:j]的最长公共子序列,因此dp[i][j]=dp[i-1][j-1]+1

●当text1[i-1]!=text2[j-1]时,考虑以下两项:

        ○text1[0:i-1]和text2[0:j]的最长公共子序列

         ○text[0:i]和text2[0:j-1]的最长公共子序列

要得到text1[0:i]和text2【0:j】的最长公共子序列,应该取两项中长度较大的一项

dp[i][j]=max(dp[i-1][j],dp[i][j-1])

由此可以得到状态转移方程:
(1)dp[i][j]=dp[i-1][j-1]+1,                    text1[i-1]=text2[j-1]

(2)dp[i][j]=max(dp[i-1][j],dp[i][j-1])     text1[i-1]!=text2[j-1]

【动态规划】LeetCode 1143最长公共子序列_算法_02

    代码:

class Solution {
    public:
        int longestCommonSubsequence(string text1, string text2) {
            vector<vector<int>>dp(text1.size() + 1, vector<int>(text2.size() + 1));
            for(int i=0;i<text1.size();i++)
            {
                for (int j = 0; j < text2.size(); j++)
                {
                    dp[0][j] = 0;
                    dp[i][0] = 0;
                }
        } 
            for (int i = 1; i <=text1.size(); i++)
           {
            for (int j = 1; j <=text2.size(); j++)
            {
                if (text1[i-1] == text2[j-1])
                {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else
                {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
            return dp[text1.size()][text2.size()];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.