最长公共子序列-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/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章