Substrings &&http://acm.hdu.edu.cn/showproblem.php?pid=1238

本文介绍了一种寻找多个字符串间最长公共子串的搜索算法。通过先对字符串排序并选取最短字符串,再从长到短枚举子串来高效求解。文章提供了完整的C++实现代码。

话说这两天心里挺纠结的,,总是静不下心学习,,放假留校的孩纸伤不起啊!!!。。。

题意:这是一道搜索入门题,就是找所有字符串共有的最长串的长度。。。先把所有字符串从小到大排序,找出最短串,然后枚举最短串,(和反转串)需要注意一点就是从长到短进行枚举,,,一旦找到就是答案。。。

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string  s[101];
int n;
bool cmp(string a,string b)
{return a.size()<b.size();}
string revers(string t)
{ string a="";
  for(int i=t.size()-1;i>=0;--i)
   a.append(1,t[i]);//相当于在a后面加一个字符t[i].
  return a;
 }
int f(string a)
 {  int m=a.size();
    for(int i=m;i>=1;--i)//子串从长到短枚举。。。。
		for(int j=0;i+j<=m;++j)
		{  string b=a.substr(j,i);
	        string c=revers(b);
			bool flag=1;
			for(int k=1;k<n;++k)
			{ if(s[k].find(b)!=-1) continue;
			  if(s[k].find(c)!=-1) continue;
			   flag=0;
			   break;//有一个字符串不包含该子串有就跳出当前循环。
			}
			if(flag) return b.size();
      }
	return 0;
  }
int main()
{ int Case;
   cin>>Case;
   while(Case--)
   {  cin>>n;
    for(int i=0;i!=n;++i)
		 cin>>s[i];
	sort(s,s+n,cmp);
	cout<<f(s[0])<<endl;
   }return 0;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值