忘了是看了哪位大哥的代码啦...就是暴力搜索....首先,我们先输入所有的字符串,保存起来...然后
1.我们再从第一个字符串中开始,从第一个字符串str中第一个位置开始截取长度为3的子串,保存为s
用s到其他字符串中查找,
2,然后从第一个字符串str中第二个.....到最后的每一个位置截取长度为3的子串,保存s然后查询,
3,这个时候我们查询完所有长度为3的子串了...
然后就是从第一步开始,截取长度为4...到60的子串....注意对于每个长度的子串都要像1,2,3步那样从不同的位置截取..下面是代码
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main()
{
int T,n;
int i,j;
string str[11];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
cin>>str[i];
string ans;//这是用来存储结果的
for(i=3;i<=60;i++)//截取子串从三开始,为什么呢?因为题目说小于3的子串就不用输出,所有从3开始
{
for(j=0;j<=60-3;j++)//这里是对于每个子串,从str[0]的不同位置开始截取,其实j<60-i也是可以的,因为子串就有i这么长,j是最后的要截取的开始位置
{
bool flag=true;
string s=str[0].substr(j,i);//这个函数的意思是从str[0]中下标j开始截取长度为i的子串
for(int k=1;k<n;k++)//截取str[0]的子串,从str[1]开始查找
if(str[k].find(s) == string::npos)//这是string的find函数,找不到就是这个返回string::npos
{
flag=false;
break;
}
if(flag && s.size()>ans.size())//如果找到了,比较长度,选择长度大的
ans=s;
else if(flag && s.size()==ans.size() && s<ans)//如果长度相等,就看字典序大小
ans=s;
}
}
if(!ans.empty())
printf("%s\n",ans.c_str());
else
printf("no significant commonalities\n");
}
return 0;
}