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

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长公共子序列-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算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于最长公共子序列-II(NC92/考察次数Top58/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子串(NC127/考察次数Top22/难度中等)

最长递增子序列(NC91/考察次数Top32/难度中等)

最长公共前缀(NC55/考察次数Top64/难度简单)

最长公共前缀(NC55/考察次数Top64/难度简单)

最长回文子串(NC17/考察次数Top29/难度中等)

最长无重复子数组(NC41/考察次数Top14/难度中等)