zoukankan      html  css  js  c++  java
  • 求多字符串的最长公共子串(POW) 皇星客栈

    求多字符串的最长公共子串(POW)

         给定n个字符串,求这n个字符串的最长公共子串。例如给3个字符串:'abcb'、'bca'和'acbc',则这三个字符串的最长公共子串即为'bc'。输入第一行为n,下面n行即为这n个字符串。输出它们的最长公共子串。

    样例:

    输入:

    输出:

    3

    abcb

    bca

    acbc

    bc

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 
      4 char POW[200][200];
      5 char S[200];
      6 char T[200];
      7 int len[200];
      8 int nextval[256];
      9 int length_1;
     10 int ma;
     11 int length;
     12 int n;
     13 int ans; 
     14 
     15 void get_nextval( )
     16 {//求模式串T的next函数修正值并存入数组nextval.    
     17     int i=0;
     18     int j=1;
     19     int length;
     20     nextval[0]=-1;
     21     nextval[1]=0;
     22     length=strlen(T);
     23     
     24     while(j<length)
     25     {    
     26         if(i==-1||T[j]==T[i])
     27         {
     28             ++i;
     29             ++j;
     30             if(T[j]==T[i]) 
     31                 nextval[j]=nextval[i];
     32             else 
     33                 nextval[j]=i;
     34         }    
     35         else        
     36             i=nextval[i];
     37     } 
     38 /*    for( i=0; i<strlen(T);i++ )
     39         printf("%d ",nextval[i]);
     40     printf("\n");*/
     41 }
     42 
     43 void KMP( )
     44 {        
     45     int i;
     46     int j;
     47     int k;
     48     int m;
     49     ma=200;
     50     get_nextval( );
     51     for( k=1; k<n; k++ ) 
     52     {   
     53         i=0;
     54         j=0;
     55         m=0;
     56         while( j<length_1 && i < len[k] )
     57         {
     58             if( j==-1 || POW[k][i]==T[j] )    
     59             {    
     60                 ++i;    
     61                 ++j;            //继续比较后继字符    
     62             }    
     63             else          
     64                 j=nextval[j];  //模式串向后移动
     65             if( j>m )
     66                 m=j;
     67         }
     68         if( m<ma )
     69             ma = m;
     70     }
     71 }
     72 
     73 int main( )
     74 {    
     75     int i;
     76     int j;
     77     while( scanf("%d",&n) != EOF )    
     78     {    
     79         ans=0;
     80         for( i=0; i<n; i++ )
     81         {
     82             scanf("%s",POW[i]);
     83             len[i] = strlen(POW[i]);
     84         }
     85         for( i=0; i<len[0]; i++ )
     86         {
     87             strcpy(T,POW[0]+i);
     88             length_1 = len[0]-i;
     89             KMP( );
     90             if( ma > ans )
     91             {
     92                 ans = ma;
     93                 for( j=0; j<ans; j++ ) //记录公共子串
     94                     S[j] = T[j];
     95                 S[j] = '\0';
     96             }
     97         }
     98     //    printf("%d\n",ans);
     99         printf("%s\n",S);
    100     }
    101     return 0;      
    102 }
  • 相关阅读:
    求出123456 8910,数字,显示出来
    Django之Model操作
    AJAX全套
    Python之路【第十六篇】:Django【基础篇】
    Q2Day81
    Django第二重点(thml与django连接)
    react
    es6 和 python 语法比较
    微信
    py库: GUI(tkinter)
  • 原文地址:https://www.cnblogs.com/huangxingkezhan/p/2720530.html
Copyright © 2011-2022 走看看