leetcode 1143. 最长公共子序列

文章介绍了如何使用动态规划的dp数组来求解两个字符串的最长公共子序列。定义了dp数组的下标和值,给出了递推公式,并详细解释了不相等字符时的处理方式,以及初始化和遍历顺序。最后提供了一个C++实现的代码示例。
摘要由CSDN通过智能技术生成

 

1. dp 数组的定义

        下标: 以 i  - 1 和 j - 1 为结尾的子序列

        值:以 i  - 1 和 j - 1 为结尾的最长公共子序列的长度

2. 递推公式

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]); 


    不相等分为两种情况
        i - 1 之后,再与当前的 j 比较
        例如:abcd  abe,此时的 c 和 e 不相等,所以就向前比较,ab 与 abe
             |i|    |j|
        j - 1 之后,再与当前的 i 比较
        例如:abcd  abe,此时的 c 和 e 不相等,所以就向前比较,abc 与 ab

3. 初始化,因为是从 dp数组的定义是从 i - 1 和 j - 1 进行比较的,所以可以默认初始化

4. 遍历顺序

        从小到大

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {

        vector<vector<int>> dp(text1.size()+ 1, vector<int>(text2.size() + 1, 0));

        int res = 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()];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值