求多字符串的最长公共子串(POW)
2012-10-11 21:35
148 查看
求多字符串的最长公共子串(POW)
给定n个字符串,求这n个字符串的最长公共子串。例如给3个字符串:'abcb'、'bca'和'acbc',则这三个字符串的最长公共子串即为'bc'。输入第一行为n,下面n行即为这n个字符串。输出它们的最长公共子串。样例:
输入: | 输出: |
3 abcb bca acbc | bc |
#include<stdio.h> #include<string.h> char POW[200][200]; char S[200]; char T[200]; int len[200]; int nextval[256]; int length_1; int ma; int length; int n; int ans; void get_nextval( ) {//求模式串T的next函数修正值并存入数组nextval. int i=0; int j=1; int length; nextval[0]=-1; nextval[1]=0; length=strlen(T); while(j<length) { if(i==-1||T[j]==T[i]) { ++i; ++j; if(T[j]==T[i]) nextval[j]=nextval[i]; else nextval[j]=i; } else i=nextval[i]; } /* for( i=0; i<strlen(T);i++ ) printf("%d ",nextval[i]); printf("\n");*/ } void KMP( ) { int i; int j; int k; int m; ma=200; get_nextval( ); for( k=1; k<n; k++ ) { i=0; j=0; m=0; while( j<length_1 && i < len[k] ) { if( j==-1 || POW[k][i]==T[j] ) { ++i; ++j; //继续比较后继字符 } else j=nextval[j]; //模式串向后移动 if( j>m ) m=j; } if( m<ma ) ma = m; } } int main( ) { int i; int j; while( scanf("%d",&n) != EOF ) { ans=0; for( i=0; i<n; i++ ) { scanf("%s",POW[i]); len[i] = strlen(POW[i]); } for( i=0; i<len[0]; i++ ) { strcpy(T,POW[0]+i); length_1 = len[0]-i; KMP( ); if( ma > ans ) { ans = ma; for( j=0; j<ans; j++ ) //记录公共子串 S[j] = T[j]; S[j] = '\0'; } } // printf("%d\n",ans); printf("%s\n",S); } return 0; }
相关文章推荐
- 求两个字符串中间最长的公共子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 求两个字符串的最长的连续公共子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 用动态规划的方法求解两个字符串的最长公共子串
- 求两个字符串的最长公共子串,最长公共子序列,编辑距离
- HDU 1503 Advanced Fruits 由两个字符串组成一个最短新串 (最长公共子串变形)
- 两个字符串的最长公共子串-后缀数组
- SPOJ - LCS Longest Common Substring 求2个字符串的最长公共子串
- 求两个字符串的最长的连续公共子串
- 【华为oj】oj2034查找两个字符串a,b中的最长公共子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 两个字符串的最长连续公共子串
- 两个字符串寻找最长公共子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 【华为OJ】【081-查找两个字符串a,b中的最长公共子串】
- VB6求两个字符串最长公共子串的问题
- 最长公共子串,字符串
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 求两个字符串的最长公共子串(LCS)