您的位置:首页 > 职场人生

【面试准备】最长公共子序列

2014-09-01 19:06 190 查看
#include <iostream>
#include <string.h>
using namespace std;
#define MAXLEN 100

void LCSLength(char* x, char *y, int m, int n, int c[][MAXLEN],
int b[][MAXLEN]) {//c[][]记录x[i]与y[i]的LCS长度;b[][]记录c[i][j]是通过哪一个子问题的值求得的以决定搜索方向
for (int i = 0; i <= m; ++i) {
c[i][0] = 0;
}
for (int i = 0; i <= n; ++i) {
c[0][i] = 0;
}
for(int i = 1 ; i <= m; ++i){
for(int j = 1;j <= n; ++j){
if(x[i-1] == y[i-1]){
c[i][j] = c[i-1][j-1]+1;
b[i][j] = 0;
}
else if(c[i-1][j] > c[i][j-1]){
c[i][j] = c[i-1][j];
b[i][j] = 1;
}
else{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
}

void PrintLCS(int b[][MAXLEN],char* x,int i,int j){
if(i == 0|| j == 0){
return ;
}
if(b[i][j] == 0){
PrintLCS(b,x,i-1,j-1);
cout<<x[i-1];
}
else if(b[i][j] == 1){
PrintLCS(b,x,i-1,j);
}
else{
PrintLCS(b,x,i,j-1);
}
}

int main() {
char x[MAXLEN];
char y[MAXLEN];
int b[MAXLEN][MAXLEN];
int c[MAXLEN][MAXLEN];
int m,n;
cout<<"Input!"<<endl;
cin>>x;
cout<<"Input!"<<endl;
cin>>y;
m = strlen(x);
n = strlen(y);

LCSLength(x,y,m,n,c,b);
PrintLCS(b,x,m,n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: