样例1输入:
A B C B D A B B D C A B A
样例1输出:
4 BCBA
样例1说明:
输入:第一行输入序列X的各元素,第二行输入序列Y的各元素,元素间以空格分隔。
输出:序列X和Y的最长公共子序列的长度为4,其中一个最长公共子序列为:BCBA。
样例2输入:
A B C D E F G H
样例2输出:
0 None
样例2说明:
输入:第一行输入序列X的各元素,第二行输入序列Y的各元素,元素间以空格分隔。
输出:序列X和Y的最长公共子序列为空,最长公共子序列的长度为0,最长公共子序列为:None。
c++代码:
#include <iostream>
#include <vector>
using namespace std;
int len1;//第一个字符串的长度
int len2;//第二个字符串的长度
int dp[100][100];//记录长度
int d[100][100];//记录位置
void maxList(vector<char>&str1,vector<char>&str2){
//初始化dp数组
for(int i=0;i<=len1;i++){
for(int j=0;j<=len2;j++){
if(i==0||j==0){
dp[i][j]=0;
}
}
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(str1[i-1]==str2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
d[i][j]=0;
}else if(dp[i-1][j]>=dp[i][j-1]){
dp[i][j]=dp[i-1][j];
d[i][j]=1;
}else{
dp[i][j]=dp[i][j-1];
d[i][j]=-1;
}
}
}
}
void traceBack(int i,int j,vector<char>&str1,int d[][100]){
if(i==0||j==0)return;
if(d[i][j]==0){
traceBack(i-1,j-1,str1,d);
cout<<str1[i-1]<<" ";//i-1不是i,因为字符串是从0到len1-1,回溯的时候
//从len1开始的,故应该-1使对应上
}else if(d[i][j]==1){
traceBack(i-1,j,str1,d);
}else{
traceBack(i,j-1,str1,d);
}
}
int main(){
vector<char>str1;
vector<char>str2;
char c;
cout<<"输入第一个字符串:";
while(cin>>c){
str1.push_back(c);
if(cin.get()=='\n')break;
}
cout<<"输入第二个字符串:";
while(cin>>c){
str2.push_back(c);
if(cin.get()=='\n')break;
}
len1=str1.size();
len2=str2.size();
maxList(str1,str2);
cout<<"最长公共子序列的长度:"<<dp[len1][len2]<<endl;
cout<<"最长公共子序列为:";
if(dp[len1][len2]==0){
cout<<"None";
}else{
traceBack(len1,len2,str1,d);
}
}
结果输出: