POJ_3083_Blue Jeans(串)

题意:牵扯到DNA了都,意思就是说输入几串字符串找他们当中最长的公共子串。由于字符串不长,数量不多,可以以一子串为基准从2个字母开始一个一个往后搜,如果连最短的都没有公共的那么长一点肯定是没有的。用到一个函数strstr(str1,str2);在str1中找str2这个子串如果没有返回NULL。

 1 /*
 2 关键是理解好几个标记变量的作用。
 3 */
 4 # include <stdio.h>
 5 # include <string.h>
 6 char str[61][100];
 7 char str1[100];
 8 char leag[61];  //存储待定公共子串。
 9 char ans[100];  //存储公共子串。
10 void get_answer()
11 {
12     int m,n,i,j,k,t;
13     scanf("%d",&n);
14     scanf("%s",str1);
15     getchar();
16     n--;
17     int len=2;
18     for(i=0;i<n;i++)
19         gets(str[i]);
20     m=strlen(str1);
21     t=0;    //用于判断标记是否含有公共子串,如果没有直接输出 返回。
22     while(len <= m)   //长度从2开始一直找到m因为公共子串长度最少是2,最大是m。
23     {
24         int flag=0;
25         for(i=0;i<=m-len;i++)   //长度为len的公共子串可能的取值。
26         {
27             int cnt; //leag的下标。
28             int temp=1;
29             for(j=i,cnt=0;cnt<len;j++,cnt++)
30                 leag[cnt]=str1[j];  //记录待定公共子串;
31             leag[len]='\0';
32             for(k=0;k<n;k++)
33             {
34                 if(strstr(str[k],leag) == NULL) //如果全部的字符串中有一个没有leag那么flag+1;继续找len+1。
35                     temp=0;
36             }
37             if(temp)
38             {
39                 strcpy(ans,leag);
40                 t=1;
41             }
42             else 
43                 flag++;
44         }    
45     //    printf("**%d**\n",flag);
46         if(flag == m-len+1 && t !=1) //如果找到末尾都没找到一个字符串中含有leag,并且比len小的也没有子串那么就不可能有了。
47         {
48             printf("no significant commonalities\n");
49             return ;
50         }
51         len++;
52     }    printf("%s\n",ans);
53 }
54 int main()
55 {
56     int i,j,k,n;
57     scanf("%d",&n);
58     while(n--)
59     {
60         get_answer();
61     }
62     return 0;
63 }

 

posted on 2013-08-19 15:51  随风浪子的博客  阅读(154)  评论(0编辑  收藏  举报

导航