LeetCode1143. 最长公共子序列 (dp)

力扣

 

解题思路:

1.状态定义:

dp[i][j] 表示 text1[0] - text1[i -1] 之间的序列 和 text2[0] - text2[ j-1] 之间的序列的最长公共子序列

2.状态转义方程:

① 当 text1[i - 1] == text2[j - 1] 时,说明两个子字符串的最后一位相等,所以最长公共子序列又增加了 1,即 dp[i][j] = dp[i - 1][j - 1] + 1 。
② 当 text1[i - 1] != text2[j - 1] 时,说明两个子字符串的最后一位不相等,那么此时的状态 dp[i][j] 应该是 dp[i - 1][j] 和 dp[i][j - 1] 的最大值。

dp[i][j] = dp[i - 1][j - 1] + 1 , 当 text1[i - 1] == text2[j - 1]。
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) , 当 text1[i - 1] != text2[j - 1]。

3.状态初始化:

创建一个二维数组 ,dp[ i ][ j ]  ,   i==0  / j == 0    dp[ i ][ j ] = 0 ;因为任何序列遇到 空 ,公共子序列都为0.

4.返回值:   dp[ text1.size() ][ text2.size() ] 

            

//图片来自力扣题解:    

 

 代码:

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) 
    {
        int m = text1.size(); //m行
        int n = text2.size(); //n列

       if(m == 0 || n == 0 ) //判断空
       return 0;

       vector<vector<int>> dp(m+1 , vector<int>(n+1 , 0)); //dp数组
       
       for(int i = 1 ; i <= m ;++i)
       {
           for(int j = 1 ; j <= n ;++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[m][n];
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值