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

来源:互联网 发布:淘宝宝贝复制大师 编辑:程序博客网 时间:2024/06/05 03:45
#include <iostream>#include <string.h>using namespace std;#define MAXLEN 100void 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;}

0 0
原创粉丝点击