最长公共子序列(LCS)
问题描述
给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)
样例输入
sadstory
adminsorry
样例输出
6
定义dp[i][j]表示字符串s1的i号位与字符串s2的j号位之前的最长公共子序列长度
状态转移方程:当s1[i] == s2[j]时,dp[i][j] = dp[i-1][j-1] + 1
当s1[i] != s2[j]时,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
#include <bits/stdc++.h>
using namespace std;
int main(){
string s1, s2;
getline(cin, s1);
getline(cin, s2);
int len1 = s1.length();
int len2 = s2.length();
int dp[len1+1][len2+1]; //因为状态转移方程-1,因此得从1开始
for(int i = 0; i <= len1; i++){ //并设定初始化
for(int j = 0; j <= len2; j++){
dp[i][j] = 0;
}
}
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
if(s1[i-1] == s2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout<<dp[len1][len2];
return 0;
}