- #include "stdio.h"
- #include "string.h"
- #include "stdlib.h"
- char str[100][100];
- int k;
- int match(int start,int end,int n) //最短字符串中的起点下标、终点下标,字符串总数
- {
- int i,j,len,p,h;
- for(i=0;i<n;i++)
- {
- if(i==k)
- continue;
- len=strlen(str[i]);
- for(j=0;j<=len-1-end+start;j++) //str[i]字符串可以组成len-1-end+start个长度为end-start的连续子串
- {
- for(p=start,h=j;p<=end;p++,h++) //顺序判断子串
- {
- if(str[k][p]!=str[i][h]) //不等即跳出
- break;
- }
- if(p>end) //如果全部相等,则匹配成功,终止
- break;
- for(p=end,h=j;p>=start;p--,h++) //逆序判断子串
- {
- if(str[k][p]!=str[i][h]) //不等即跳出
- break;
- }
- if(p<start) //如果全部相等,则匹配成功,终止
- break;
- }
- if(j>len-1-end+start) //如果搜索完毕都没终止,即无匹配
- return 0;
- }
- return 1;
- }
- int main(void)
- {
- int t,i,j,n,len,minlen,flag;
- scanf("%d",&t);
- while(t--)
- {
- minlen=1000,flag=0;
- scanf("%d",&n);
- for(i=0;i<n;i++)
- {
- scanf("%s",str[i]);
- len = strlen(str[i]);
- if(len<minlen)
- {
- minlen=len; //保存最短字符串的长度
- k=i; //保存最短字符串的序号
- }
- }
- for(i=0;i<minlen;i++) //对最短字符串的连续字串进行匹配查找
- {
- for(j=0;j<=i;j++)
- {
- if(match(j,j+minlen-1-i,n)) //子串是否匹配
- {
- flag=1;
- break;
- }
- }
- if(flag==1)
- break;
- }
- printf("%d\n",minlen-i);
- }
- system("pause");
- return 0;
- }
复制代码
从网上到找的 ,给大家分享一下。
里面的算法很基本 ,注释也很清楚。
如果当初多想一下的话,没准就拿到这2分了,很可惜。 |
|