题目大意:
给你n个长度都为60的串,求出它们的最长公共子串,如果这个子串的长度 < 3则输出“no significant commonalities”,如果存在多个最长公共子串,则输出字典序最小的那一个。
解题思路:
直接枚举第一串的所有子串,然后与后面的所有串进行比较即可
代码如下:
#include<iostream>
#include<string.h>
using namespace std;
const int len=60;
int main(int i,int j)
{
int test;
cin>>test;
for(int t=1;t<=test;t++)
{
int n;
cin>>n;
char **DNA=new char*[n];
for(int p=0;p<n;p++)
{
DNA[p]=new char[len+1];
cin>>DNA[p];
}
char obj[len+1];
int StrLen=0;
int length=1;
for(i=0;;i++)
{
char dna[len+1];
int pi=i;
if(pi+length>len)
{
length++;
i=-1;
if(length>len)
break;
continue;
}
for(j=0;j<length;j++)
dna[j]=DNA[0][pi++];
dna[j]='\0';
bool flag=true;
for(int k=1;k<n;k++)
{
if(!strstr(DNA[k],dna))
{
flag=false;
break;
}
}
if(flag)
{
if(StrLen<length)
{
StrLen=length;
strcpy(obj,dna);
}
else if(StrLen==length)
{
if(strcmp(obj,dna)>0)
strcpy(obj,dna);
}
}
}
if(StrLen<3)
cout<<"no significant commonalities"<<endl;
else
cout<<obj<<endl;
delete DNA;
}
return 0;
}
422

被折叠的 条评论
为什么被折叠?



