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 }