Description
Input
Output
Sample Input
3 2 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 3 GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA 3 CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Sample Output
no significant commonalities AGATAC CATCATCAT
题目大意:
给出一个DNA碱基序列的集合,确定在所有序列中都出现的最长的碱基序列!
说一下输出的问题吧:输出最长的相同的碱基子序列,如果最长的相同的碱基子序列的长度小于3,则输出那一串英文;如果相同的最长长度的子序列有多个,则仅输出按字典序排序的第一个即可!
这个题我用的是BF算法,很黄很暴力的说!
但是由于字符串的长度仅为60,所以不用担心超时的问题了!
这个题我使用了#include<cstring>头文件里的几个函数-->strncpy(),strstr(),strcpy()这三个函数不知道的话可以百度下,这样同时可以加深自己对这三个函数的理解!至于是干什么的,下面的代码里我会有注释的!
这样写起来,方便得多,代码看起来也一目了然,不会太繁琐、枯燥!
代码如下:(关键步骤都是有详细的注释的!)
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int main() { int T,m; char ss[13][520]; cin>>T; while(T--) { cin>>m; for(int i=0; i<m; i++) cin>>ss[i]; char str[520],te[520];//te[]为临时字符串! int len=strlen(ss[0]); int maxlong=0;//设当前最长公共字串为0! for(int i=0; i<len; i++) { //由于要求最长字符串长度必须大于3,所以j=i+2; for(int j=i+2; j<len; j++) { int telen=j-i+1;//临时字符串长度! strncpy(te,ss[0]+i,telen);//这个函数作用是复制指定长度的字符串字串! te[telen]='\0'; int flag=0;//标记te字符串是不是p[1]到p[m-1]的公共字串! for(int k=1; !flag&&k<m; k++) { //如果未找到 if(strstr(ss[k],te)==NULL) flag=1;//strstr函数是搜索一个字符串在另一个字符串中是否第一次出现!如果没出现过则返回null或者false! }//这个函数前后的参数分别是strstr(另一个字符串首地址,一个字符串首地址)! if(!flag)//搜索到了! if(telen>maxlong||(telen==maxlong&&strcmp(te,str)<0))//按字典序排序! { maxlong=telen; strcpy(str,te); } } } if(maxlong>=3) cout<<str<<endl; else cout<<"no significant commonalities"<<endl; } return 0; }
#include<cstring> #include<stdio.h> #include<iostream> using namespace std; const int maxn = 70; char b[10][maxn], p[maxn]; int n, ma, lenp, next[maxn]; void kk() { int i = 0, j = -1; next[0] = -1; while(i < lenp) { if(j == -1 || p[i] == p[j]) { i ++; j ++; next[i] = j; } else j = next[j]; } int k, m; ma = 100; for(int k = 1; k < n; k ++) { i = 0; j = 0; m = 0; while(i < 60 && j < lenp) { if(j == -1 || b[k][i] == p[j]) { i ++; j ++; } else j = next[j]; if(j > m) m = j; } if(m < ma) ma = m; } } int main() { int t; char a[maxn]; scanf("%d", &t); while(t --) { scanf("%d", &n); for(int i = 0; i < n; i ++) scanf("%s", b[i]); int ans = 0; for(int i = 0; i <= 57; i ++) { strcpy(p, b[0] + i); lenp = 60 - i; kk(); if(ans < ma) { ans = ma; strncpy(a, b[0] + i, ans); a[ans] = '\0'; } else if(ans == ma) { char tmp[maxn]; strncpy(tmp, b[0] + i, ans); tmp[ans] = '\0'; if(strcmp(tmp, a) < 0) strcpy(a, tmp); } } if(ans >= 3) printf("%s\n", a); else printf("no significant commonalities\n"); } return 0; }
poj-3080 blue jeans,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u014004096/article/details/37827789