问题:
给定两个字符串S1和S2,求两个字符串的最长公共子序列的长度。
输入样例
ABCD
AEBD
输出样例
3
解释
S1和S2的最长公共子序列为ABD,长度为3
解决方案:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
void LCS(string s1, string s2) {
int x = s1.size()+1;
int y = s2.size()+1;
int **z = new int*[x];
for(int i=0;i<x;i++){
z[i] = new int[y];
for(int j=0;j<y;j++){
if(i==0||j==0){
z[i][j]=0;
}else{
if(s1[i-1]==s2[j-1])
z[i][j]=z[i-1][j-1]+1;
else
z[i][j]=max(z[i-1][j],z[i][j-1]);
}
}
}
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
cout<<z[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
string s1,s2;
cin>>s1>>s2;
LCS(s1,s2);
}
结果如下:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string s1,s2;
int vec[100][100];
void abc(int x,int y){
if(x==0||y==0)
return;
else{
if(vec[x][y]==1){
abc(x-1,y-1);
cout<<s2[y-1];
}else if(vec[x][y]==3){
abc(x-1,y);
}else{
abc(x,y-1);
}
}
}
void LCS(string s1, string s2) {
int x = s1.size()+1;
int y = s2.size()+1;
int **z = new int*[x];
for(int i=0;i<x;i++){
z[i] = new int[y];
for(int j=0;j<y;j++){
if(i==0||j==0){
z[i][j]=0;
}else{
if(s1[i-1]==s2[j-1]){
z[i][j]=z[i-1][j-1]+1;
vec[i][j] = 1;
}
else{
if(z[i][j-1]>z[i-1][j]){
z[i][j]=z[i][j-1];
vec[i][j] = 2;
}else{
z[i][j]=z[i-1][j];
vec[i][j] = 3;
}
}
}
}
}
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
cout<<z[i][j]<<" ";
}
cout<<endl;
}
abc(x-1,y-1);
}
int main(){
cin>>s1>>s2;
LCS(s1,s2);
}
结果如下: