主要是遍历搜索: 刚开始这题我被吓到了,我以为需要手动写个KMP或者,最大连续子序列算法呢,后来c++ stl 里面的 string:: find 就可以实现查找的子串的功能了。
思路是,首先找到所有字符串中的最短字符串,然后获取这个字符串的所有可能字串,遍历这些字串,因为是求最大长度,所以可以优化为,从最长字串开始搜索,如果在所有字符串中都有该子串,或者该子串的反转,就满足题意。
AC代码:
#include <iostream>
#include<cstdio>
#include<string>'
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=105;
string a[maxn];
bool cmp(string a,string b){
return a.length()<b.length();
}
bool charge(string s,int n){
string tmp=s;
reverse(s.begin(),s.end());
for(int i=0;i<n;i++){
if(a[i].find(s)==-1&&a[i].find(tmp)==-1){
return false;
}
}
return true;
}
int main()
{
int T;
int n;
scanf("%d",&T);
vector<string> substrs;
string sstr;//shortest str
string tmp;
while(T--){
scanf("%d",&n);
tmp="";
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n,cmp);
sstr=a[0];
int len=sstr.length();
for(int i=0;i<len;i++){
for(int j=i+1;j<=len;j++){
tmp=sstr.substr(i,j-i);
substrs.push_back(tmp);
}
}
sort(substrs.begin(),substrs.end(),cmp);
int ans=0;
for(int i=substrs.size()-1;i>=0;i--){
if(charge(substrs[i],n)){
ans=substrs[i].length();
break;
}
}
printf("%d\n",ans);
}
return 0;
}
161

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



