题意:输入N个DNA序列,每个DNA序列长度都为60。找到这些串的最长共有子序列。
注:若找不到,或最长子序列长度小于2,则输出no significant commonalities,否则输出最长公共子串,若长度相同输出字典序最小的
思路:暴力枚举第一个DNA序列的每一个子序列,用strstr()函数与其余的序列进行匹配
strstr(s,t)是在s串中找t串,若找到,返回t串第一次在s中出现的首字符的地址,如果没有找到,返回NULL
#include<stdio.h> #include<string.h> char t[65],ans[65]; void cmp() { if(strlen(ans)<strlen(t)) strcpy(ans,t); else if(strlen(ans)==strlen(t)) if(strcmp(ans,t)>0) strcpy(ans,t); } int main() { int n,m,i,j,k,a; char s[12][65]; scanf("%d",&n); while(n--){ scanf("%d",&m); for(i=0;i<m;i++) scanf("%s",s[i]); ans[0]=0; for(i=0;i<60;i++){ //子串的起始位置为i k=0; for(j=i;j<60;j++){ t[k++]=s[0][j]; //每次在前一个子串后加上一个字符 t[k]=0; //记得在子串末尾加上空字符 for(a=1;a<m;a++) //判断其余字符串是否包含该子串 if(strstr(s[a],t)==NULL) break; if(a==m) cmp(); } } if(strlen(ans)>=3) printf("%s\n",ans); else printf("no significant commonalities\n"); } return 0; }
poj 3080 Blue Jeans,布布扣,bubuko.com
原文:http://blog.csdn.net/acm_code/article/details/38115731