sdut 1008 最大公共子串(求n个字符串的最长公共子串)lcs

来源:互联网 发布:php url传递参数 编辑:程序博客网 时间:2024/04/30 03:55

原题:最长公共字符串


可以看看这个博主写的 sdut 1008 最大公共字串


我等弱渣只能加个注释学习学习。。


#include <iostream>  #include <stdio.h>  #include <string.h>  #include <math.h>  using namespace std;  int leftup=1,left=2,up=3;  int sum[110][110];  int pt[110][110];  char s[110][110];  int main()  {      int f(char s1[110],char s2[110]);      int i,j,n,m,t;      cin>>t;      while(t--)      {          cin>>n;          for(i=0;i<=n-1;i++)          {              scanf("%s",s[i]);          }          for(i=1;i<=n-1;i++)          {              m=f(s[0],s[i]);     //一个一个的比比较            if(m==0)              {                  break;              }          }          cout<<m<<endl;      }      return 0;  }  int f(char s1[110],char s2[110])  {      int l1=strlen(s1);      int l2=strlen(s2);      char s3[110];      int i,j,n,m,x,key,val,y,len,max;      memset(sum,0,sizeof(sum));      memset(pt,0,sizeof(pt));      for(i=1;i<=l1;i++)                   {          for(j=1;j<=l2;j++)          {              max=0;              for(x=1;x<=3;x++)       //两种状态  a[i]=b[j]:sum[i-1][j-1]+1  a[i]!=b[j]:sum[i-1][j]||sum[i][j-1]            {                  if(x==1)                  {                      if(s1[i-1]==s2[j-1])                      {                          val=sum[i-1][j-1]+1;                      }else                      {                          val=sum[i-1][j-1];                      }                  }else if(x==2)                  {                      val=sum[i][j-1];                  }else                  {                      val=sum[i-1][j];                  }                  if(val>max)                  {                      max=val;                      key=x;       // key记录下取值的方式,以便还原最长公共字符串                }              }              sum[i][j]=max;              pt[i][j]=key;          }      }      x=l1; y=l2;      len=sum[l1][l2];      len-=1;      s3[sum[l1][l2]]='\0';      for(i=1;i<=sum[l1][l2];i++)  //按照保存好的key还原字符串    {           while(s1[x-1]!=s2[y-1])           {               key=pt[x][y];               if(key==1)               {                   x-=1; y-=1;               }else if(key==2)               {                   y-=1;               }else               {                   x-=1;               }           }           s3[len]=s1[x-1];           len-=1;           key=pt[x][y];           if(key==1)           {               x-=1; y-=1;           }else if(key==2)           {               y-=1;           }else           {               x-=1;           }      }      strcpy(s[0],s3);     //将最长公共字符串赋给s[0]以便与后续字符串比较    return sum[l1][l2];  }  


0 0
原创粉丝点击