hdu 1238 Substrings

Problem Description
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
 
Input
The first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
Output
There should be one line per test case containing the length of the largest string found.
Sample Input
  
  
2 3 ABCD BCDFF BRCD 2 rose orchid
Sample Output
  
  
2 2
----------------------------------------------------------------------------------
第一道搜索题
枚举长度最短的字符串的所有字串,然后与其它字符串比较
一旦比较失败,就跳出;接着循环,枚举下一个,
#include<stdio.h> #include<string.h> #include<stdlib.h> char str[110][110]; int main() {  int t,n,i,len,j,flag;  int min,max,p,x,y,k,q;  char a[102],b[102];  char c[102];  scanf("%d",&t);  while(t--)  {   scanf("%d",&n);   memset(str,0,sizeof(str));   min =110;   for(i=0;i<n;i++)   {    scanf("%s",str[i]);    len = strlen(str[i]);    if(len<min)    {     min = len;     p = i;    }   }    max=0;   for(i=0;i<min;i++)   {    for(j=1;j<=min-i;j++)// 此循环,控制以某一个字母开头的所有字串,下面的查找循环中,如果,没有找到以此字母开头的字串,就跳出;
// 枚举以下一个字母开头的所有字串    {     strncpy(a,str[p]+i,j);// 枚举str[p]的字串;     a[j]='\0';     //printf("a:%s\n",a);     //b = strrev(a);     x=0;q=0;     for(k=j-1;k>=0;k--)        b[x++]=a[k];     b[x]='\0';     //printf("b:%s\n",b);     flag=1;     for(y=0;y<n;y++) //这里是与其它字符串比较,一旦查找失败,就跳出     {      if(y!=p)      {       if(strstr(str[y],a)==NULL&&strstr(str[y],b)==NULL)       { flag=0 ;break; }      }     }     if(!flag)// 以某一个字母开头的第一个子串查找失败,那么就没有必要查找以该字母开头的其它子串,所以这里跳出第二个for循环      break;     if(max<j)// 这里负责找到长度最大的字串     {      max=j;       //for(x=0;x<j;x++) // 加上这几句,就能求出 最长公共字串;      // c[q++] = a[x];      //c[x]='\0';     }    }   }   printf("%d\n",max);  }  return 0; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值