题目描述
对序列X=(x1, x2, .., xm),定义其子序列为(xi1, xi2, .., xik),i1<i2<..<ik。 请计算两个序列X=(x1, x2, .., xm),Y=(y1, y2, .., yn)的最长公共子序列的长度。
输入
输入为若干行,每行是一个计算题目,每行包括两个长度不超过100的字符串,中间用空格隔开。
输出
对每一行中的两个字符串,计算并输出其最大公共子序列的长度。 每一行输入的计算结果输出一行。
样例输入
a a
a ab
abcd dcba
abcd bc
abcdef aabacfe
样例输出
1
1
1
2
4
这是一道典型的动态规划题,时间复杂度为O (m*n),其思路是遍历两个字符串,维护一个二维数组a[i][j],表示数组1从头到i位置和数组2从头到j位置的最大重复长度。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c[105][105];
signed main(){
string s1,s2;
while(cin>>s1>>s2){
int len1=s1.length();
int len2=s2.length();
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(s1[i-1]==s2[j-1]){
c[i][j]=c[i-1][j-1]+1;
}
else{
c[i][j]=max(c[i-1][j],c[i][j-1]);
}
}
}
cout<<c[len1][len2]<<endl;
}
return 0;
}