最长连续公共子序列
题目链接:3692. 最长连续公共子序列 - AcWing题库
/*
解法:定义dp[i+1][j+1]为以a[i]结尾的字符串和b[j]结尾的字符串的最长连续公共子序列
那么对于a[i] == b[j]的时候 dp[i+1][j+1] == dp[i][j]+1否则为0 其他就是细枝末节
*/
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=1e2+11;
int dp[N][N];
int ans,ansi;
int main()
{
string a,b;
cin>>a>>b;
for(int i=0;i<a.size();i++){
for(int j=0;j<b.size();j++){
if(a[i]==b[j]){
dp[i+1][j+1] = dp[i][j]+1;
}
if(ans<=dp[i+1][j+1]){
ans = dp[i+1][j+1];
ansi = i;
}
}
}
cout<<ans<<endl;
for(int i =ans;i>0;i--){
cout<<a[ansi-i+1];
}
cout<<endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=1e2+11;
/*内存优化
滚动数组优化 对于dp[i][j]二维定义 每次dp[i+1][j+1]的计算只会引用dp[i][j]
那么0到i-1行的数据都是不使用的 故定义dp[i+1]在内层循环根据j的变化来代表
a[i]结尾的字符串和b[j]结尾的字符串的最长连续公共子序列
*/
int dp[N];
int ans,ansi;
int main()
{
string a,b;
cin>>a>>b;
for(int i=0;i<a.size();i++){
for(int j=b.size()-1;j>=0;j--){// 以dp[i+1][j+1]被压缩之前 只会引用dp[i][0~j]的数据 所以我们计算时候要从大往小算避免数据被提前错误跟新
if(a[i]==b[j]){
dp[j+1] = dp[j]+1;
}else dp[j+1]=0;
if(ans<=dp[j+1]){
ans = dp[j+1];
ansi = j;
}
}
}
cout<<ans<<endl;
for(int i =ans;i>0;i--){
cout<<b[ansi-i+1];
}
cout<<endl;
return 0;
}