最长公共子序列LCA

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

最长连续公共子序列

题目链接: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;
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6