最长公共子序列C语言代码

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. int c[200][200];   //用c[i][j]记录X[i]与Y[j] 的LCS 的长度  
  4. int b[200][200];   //b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向  
  5. char f[200];  
  6.   
  7. /*-----------------------分割线--------------------------------*/  
  8.   
  9. /*取c[i-1][j]和c[i][j-1]的最大值,并记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向*/  
  10. int Max(int m,int n,int i,int j)  
  11. {  
  12.     if(m > n)  
  13.     {  
  14.         b[i][j] = -1;  
  15.         return m;  
  16.     }  
  17.     else  
  18.     {  
  19.         b[i][j] = 1;  
  20.         return n;  
  21.     }  
  22. }  
  23. /*-----------------------分割线--------------------------------*/  
  24. /*递归打印LCS的元素内容*/  
  25. void print(int i,int j,int s,char x[],char y[])  
  26. {  
  27.     if(b[i][j] == 0)  
  28.     {  
  29.         f[s-1] = x[i-1];  
  30.         i--;j--;s--;  
  31.         print(i,j,s,x,y);  
  32.     }  
  33.     else if(b[i][j] == -1)  
  34.     {  
  35.         i--;  
  36.         print(i,j,s,x,y);  
  37.     }  
  38.     else if(b[i][j] == 1)  
  39.     {  
  40.         j--;  
  41.         print(i,j,s,x,y);  
  42.     }  
  43. }  
  44. /*-----------------------分割线--------------------------------*/  
  45. int LCS(char x[],char y[])  
  46. {  
  47.     int i,j;  
  48.     int x_len,y_len;  
  49.     x_len = strlen(x);  
  50.     y_len = strlen(y);  
  51.     printf("   ");  
  52.     for(i = 0;i < y_len;i++)  
  53.     {  
  54.         printf("%c  ",y[i]);  
  55.     }  
  56.     printf("\n");  
  57.     for(i = 1;i <= x_len;i++)  
  58.     {  
  59.         printf("%c  ",x[i-1]);  
  60.         for(j = 1;j <= y_len;j++)  
  61.         {  
  62.             if(x[i-1] == y[j-1])  
  63.             {  
  64.                 c[i][j] = c[i-1][j-1] +1;  
  65.                 b[i][j] = 0;  
  66.                 printf("%d  ",c[i][j]);  
  67.             }  
  68.             else  
  69.             {  
  70.                 c[i][j] = Max(c[i-1][j],c[i][j-1],i,j);  
  71.                 printf("%d  ",c[i][j]);  
  72.             }  
  73.         }  
  74.         printf("\n");  
  75.     }  
  76.     /*-------------------------分割线---------------------------------------*/  
  77.     //打印X和Y的LCS  
  78.     printf("X和Y的LCS是:");  
  79.     print(x_len,y_len,c[x_len][y_len],x,y);  
  80.     printf("%s",f);  
  81.     printf("\n");  
  82.     return c[x_len][y_len];  
  83. }  
  84.   
  85. /*------------------------------分割线----------------------------------------*/  
  86. void main()  
  87. {  
  88.     char X[200],Y[200];  
  89.     int i,j,s;  
  90.     printf("请输入字符串X:");  
  91.     scanf("%s",X);  
  92.     while(strlen(X) > 200)  
  93.     {  
  94.         printf("您输入的字符串超过最大长度,请重新输入!");  
  95.         scanf("%s",X);  
  96.     }  
  97.     printf("请输入字符串Y:");  
  98.     scanf("%s",Y);  
  99.     while(strlen(Y) > 200)  
  100.     {  
  101.         printf("您输入的字符串超过最大长度,请重新输入!");  
  102.         scanf("%s",Y);  
  103.     }  
  104.     s = LCS(X,Y);  
  105.     printf("X和Y的LCS: %d \n",s);  
  106. }  
  • 2
    点赞
  • 0
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值