#include<iostream>
#include<string.h>
using namespace std;
char DNA[10][61];//存储字符串
char SubStr[61];//存储子串
char MaxStr[61];//最长子串
int main()
{
int test;
scanf("%d",&test);
for(int i=1;i<=test;i++)
{
//初始化
memset(DNA,0,sizeof(DNA));
memset(SubStr,0,sizeof(SubStr));
memset(MaxStr,0,sizeof(MaxStr));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",&DNA[i]);
int length=1;//子串长度
int MaxLength=0;
int flag;
//子串长度的范围
for(length=1;length<=60;length++)
{
//处理所有子串
for(int i=0;i<60-length+1;i++)
{
//保存子串
flag=false;
for(int j=0;j<length;j++)
SubStr[j]=DNA[0][i+j];
SubStr[length]='\0';
for(int j=1;j<n;j++)
{
if(0==strstr(DNA[j],SubStr))//若不是某一字符串的子串
{
flag=true;
break;
}
}
if(!flag)//该字符串是公共子串
{
if(length>MaxLength)
{
strcpy(MaxStr,SubStr);
MaxLength=length;
}
else if(length==MaxLength)
{
if(strcmp(SubStr,MaxStr)<0)
strcpy(MaxStr,SubStr);
}
}
}
}
if(MaxLength<3)
printf("%s\n","no significant commonalities");
else
printf("%s\n",MaxStr);
}
}
132K | 0MS |
思路:
DNA[0]为基准,选取DNA[0]各个长度的子串,然后与其他串比较,看其他串是否含有该子串。
函数说明:
包含文件:string.h
函数名: strstr
函数原型:extern char *strstr(char *str1, char *str2);
功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。
返回值:返回该位置的指针,如找不到,返回空指针。
KMP+暴力枚举
#include<iostream>
#include<string.h>
using namespace std;
char DNA[10][61];
char SubStr[61];
char MaxStr[61];//最长子串
int tmp[62];
void GetNext(char* p,int next[])
{
int pLen=strlen(p);
next[0]=-1;
next[1]=0;
int k=0;
for(int j=1;j<pLen;j++)
{
if(p[k]==p[j])
{
k++;
next[j+1]=k;
}
else
{
do
{
k=next[k];
}
while((k>=0)&&(p[k]!=p[j]));
k++;//k=-1;或p[k]=p[j]
next[j+1]=k;
}
}
}
bool KmpSearch(char* s,char *p,int* next)
{
int i=0,j=0;
int sLen=strlen(s);
int pLen=strlen(p);
int count=0;
while(i<sLen)
{
if(s[i]==p[j])
{
i++;
j++;
if(j==pLen)
{
return true;
j=next[j];
}
}
else
{
j=next[j];//next[0]=-1;
if(-1==j) { j++;i++;}
}
}
return false;
}
bool IsSubStr(char* s,char *p)
{
GetNext(p,tmp);
return KmpSearch(s,p,tmp);
}
int main()
{
int test;
scanf("%d",&test);
for(int i=1;i<=test;i++)
{
//初始化
memset(DNA,0,sizeof(DNA));
memset(SubStr,0,sizeof(SubStr));
memset(MaxStr,0,sizeof(MaxStr));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",&DNA[i]);
int length=1;//子串长度
int MaxLength=0;
int flag;
for(length=1;length<=60;length++)
{
//处理所有子串
for(int i=0;i<60-length+1;i++)
{
//保存子串
flag=false;
for(int j=0;j<length;j++)
SubStr[j]=DNA[0][i+j];
SubStr[length]='\0';
if(strcmp(SubStr,"ABC")==0)
int a=1;
for(int j=1;j<n;j++)
{
if(!IsSubStr(DNA[j],SubStr))//若不是某一字符串的子串
{
flag=true;
break;
}
}
if(!flag)//该字符串是公共子串
{
if(length>MaxLength)
{
strcpy(MaxStr,SubStr);
MaxLength=length;
}
else if(length==MaxLength)
{
if(strcmp(SubStr,MaxStr)<0)
strcpy(MaxStr,SubStr);
}
}
}
}
if(MaxLength<3)
printf("%s\n","no significant commonalities");
else
printf("%s\n",MaxStr);
}
}
132K | 32MS |
strstr();