首页 > 代码库 > poj 3080 Blue Jeans
poj 3080 Blue Jeans
链接:poj 3080
题意:输入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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。