poj3080

忘了是看了哪位大哥的代码啦...就是暴力搜索....首先,我们先输入所有的字符串,保存起来...然后

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值