Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526622
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-04-21 11:43:48

算法1:求得一个字符串的最大增长序列(O(n^2))

思路:将该序列按照升序的方式进行排列, 将升序的字符串中相同的字符去掉,与该序列求公共子序列
最长公共子序列:红色代码标注
                       该问题具有最优子结构性质,从后向前考虑
                       若X={x1, x2, x3, x4,xn}和Y={y1,y2,y3,y4,yn}的最长公共子序列为Z={z1,z2,z3,z4,zn};
                  则:1》若 xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列
                         2》若 xm!=yn,则xm!=zk,且Z是Xm-1和Y的最长公共子序列
                         3》若 xm!=yn,则zk  !=yn,且Z是Yn-1和Y的最长公共子序列
                    用c[i][j]记录序列Xi和Yj的最长公共子序列的长度。
                                  
                                   0                                    i=0,j=0
            c[i][j]           c[i-1][j-1]+1                    i,j>0;xi=yj
                              max{ c[i][j-1] ,c[i-1][j] }    i,j>0 ; xi!=yj
代码实现:                        

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAX 20
  5. //按照冒泡排序的方法将字符串进行排序
  6. void sort_maopao(char *mes);
  7. void show(int cst[][MAX],int hang , int lie);
  8. void LCS( int l1,int l2 , int bs[][MAX],char * mes);
  9. void LCSLength(char * mes1,int l1, char *mes2,int l2,int cst[][MAX],int bs[][MAX]);
  10. void delete_same_char(char mes2[], int len);
  11. int main()
  12. {

  13.     char *mes1 = (char*)malloc(MAX*sizeof(char));
  14.     char *mes2 = (char*)malloc(MAX*sizeof(char));
  15.     int c[MAX][MAX]={0},bs[MAX][MAX]={0};

  16.     printf("please input the string :");
  17.     fgets(mes1,MAX,stdin);
  18.     strcpy(mes2,mes1);
  19.     sort_maopao(mes2);
  20.     delete_same_char(mes2,strlen(mes2));
  21.     printf("%s \n",mes2);
  22.     LCSLength(mes1,strlen(mes1),mes2,strlen(mes2),c,bs);
  23.     show(c,strlen(mes1),strlen(mes2));
  24.     show(bs,strlen(mes1),strlen(mes2));
  25.     LCS( strlen(mes1),strlen(mes2),bs,mes1);
  26.     printf("\n");
  27.     return 0;
  28. }
  29. void sort_maopao(char *mes)
  30. {
  31.     int i=0,j=0;
  32.     char c;
  33.    
  34.     for(i=0;i<strlen(mes);i++)
  35.         for(j=0;j<strlen(mes)-i-1;j++)
  36.             if(mes[j]>=mes[j+1])
  37.             {
  38.                 c = mes[j];
  39.                 mes[j]=mes[j+1];
  40.                 mes[j+1]=c;
  41.             }

  42.     printf("%s",mes);
  43. }
  44. void delete_same_char(char mes2[], int len)
  45. {
  46.     char mes[MAX];
  47.     int in,ik=-1;

  48.     memcpy(mes,mes2,len);
  49.     memset(mes2,0,MAX);
  50.     for(in=0;in<len;in++)
  51.         if(in==0 || mes[in]!=mes2[ik])
  52.             mes2[++ik]=mes[in];

  53. }
  54. void show(int cst[][MAX], int col,int lie)
  55. {
  56.     int in= 0,ij=0;

  57.     printf("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
  58.     for(in=1;in<=col;in++) {
  59.         for(ij=1;ij<=lie;ij++)
  60.             printf(" %d ",cst[in][ij]);
  61.         printf("\n");
  62.     }

  63. }
  64. void LCS(int l1, int l2, int bs[][MAX],char *res)
  65. {
  66.     if(l1==0 ||l2 ==0)
  67.         return ;
  68.     if(bs[l1][l2]==1)
  69.     {
  70.         LCS(l1-1,l2-1,bs,res);
  71.         printf("%c",res[l1-1]);
  72.     } else if(bs[l1][l2]==2)
  73.         LCS(l1,l2-1,bs,res);
  74.     else
  75.         LCS(l1-1,l2,bs,res);
  76. }
  77. void LCSLength(char *mes1, int l1, char *mes2, int l2, int cst[][MAX],int bs[][MAX])
  78. {
  79.     int in=0,ij=0;

  80.     for(in=1;in<=l1;in++)
  81.         cst[in][0]=0;
  82.     for(in=1;in<=l2;in++)
  83.         cst[0][in]=0;
  84.    
  85.     for(in=0;in<=l1;in++)
  86.         for(ij=0;ij<=l2;ij++) {
  87.             if(mes1[in]==mes2[ij]) {
  88.                 cst[in+1][ij+1]=cst[in][ij]+1;
  89.                 bs[in+1][ij+1]=1;
  90.             }
  91.             else if(cst[in+1][ij]>=cst[in][ij+1])
  92.             {
  93.                 cst[in+1][ij+1]=cst[in+1][ij];
  94.                 bs[in+1][ij+1]=2;
  95.             }
  96.             else {

  97.                 cst[in+1][ij+1]=cst[in][ij+1];
  98.                 bs[in+1][ij+1]=3;
  99.             }
  100.         }
  101. }


阅读(921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~