最长公共子序列-II(NC92/考察次数Top58/难度中等)

描述:
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列

示例1
输入:
“1A2C3D4B56”,“B1D23A456A”
返回值:
“123456”
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * longest common subsequence
     * @param s1 string字符串 the string
     * @param s2 string字符串 the string
     * @return string字符串
     */
    string LCS(string s1, string s2) {
        //思路:利用动态规划的思想进行求解,求字符串s1和s2的最长公共子序列(不一定连着,和最长公共子串问题不一样)
        string result;
        int len1=s1.size(),len2=s2.size();                      //首先确定两个字符串的长度,建立len1行,len2列的vector
        if(len1==0||len2==0){
            return "-1";                                        //有字符串为空则返回“-1”
        }
        vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));   //建立双层嵌套vector,len1行,len2列
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                dp[i][j]=max(dp[i][j-1],dp[i-1][j]);            //i行j列的公共子序列值首先等于左边和上边的最大值
                if(s1[i-1]==s2[j-1]){                           //如果元素s1[i-1]和元素s2[j-1]相等,长度可以加1
                    dp[i][j]=dp[i-1][j-1]+1;
                }
            }
        }
        for(int i=len1,j=len2;dp[i][j]>0;){                     //根据条件进行确认i和j值的变化,从后往前进行判断
            if(s1[i-1]==s2[j-1]){
                result += s1[i-1];                              //最后一位相等,结果中加上最后一位
                i--;                                            //string1取前面的一个元素
                j--;                                            //string2取前面的一个元素
            } else if(dp[i-1][j] >= dp[i][j-1]){
                i--;                                            //说明i处没作用,string1取前面的一个元素
            } else {
                j--;                                            //说明j处没作用,string2取前面的一个元素
            }
        }
        reverse(result.begin(), result.end());                  //由于从后往前取的结果,需要进行反转
        if(result.empty()){
            return "-1";
        } else{
            return result;
        }
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值