1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| /* 动态规划算法加递归 时间复杂度为n方 */ #include<stdio.h> #include<string.h> #define MAXLEN 100
char s[MAXLEN][MAXLEN]; int len[MAXLEN],b[MAXLEN][MAXLEN],c[MAXLEN][MAXLEN];
void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN]) { int i, j; for (i=0; i<=m;i++) c[i][0]=0; for (j=1; j<=n;j++) c[0][j]=0; for (i=1;i<=m;i++) for (j=1;j<=n;j++) {if (x[i-1]==y[j-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); printf("%c",x[i-1]); } else if(b[i][j]==1) PrintLCS(b,x,i-1,j); else PrintLCS(b,x,i,j-1); }
int main() { printf("输入:\n"); for(int i=0;i<4;i++) scanf("%s",&s[i]); //为字符串数组s[]赋初值 for(i=0;i<4;i++) len[i]=strlen(s[i]); int maxn=c[len[0]][len[0]]; //c是记录最长公共子序列长度的数组 for(i=0;i<4;i++) for(int j=i+1;j<4;j++) { LCSLength(s[i],s[j],len[i], len[j], c, b); maxn=(maxn>c[len[i]][len[j]])?maxn:c[len[i]][len[j]];//获取公共位数最大值 } printf("输出:");
for(i=0;i<4;i++) for(int j=i+1;j<4;j++) { LCSLength(s[i], s[j],len[i], len[j], c, b); if(maxn==c[len[i]][len[j]]) { printf("%s ",s[i]); printf("%s ",s[j]); printf("%d ", c[len[i]][len[j]]);//打印公共位数 PrintLCS(b, s[i], len[i], len[j]);//打印子序列 printf("\n"); } } return 0; }
|