注解
1、题目意思是找到一个最长的子串,让每个字符串都包含这个子串,或者是这个子串的反。
2、关键思想:既然是找到所有字符串中的一个公共子串,那这个子串一定是在每个字符串中都出现了,那么在长度最小的字符串中也一定出现了。因此,我们只需要先找到长度最短的字符串(如果不唯一,任意一个都可以),然后暴力枚举这个长度最短的字符串的所有子串(从长度最长开始),依次跟其他字符串去比较,看其他字符串是否出现了该子串,就可以了。
3、会用substr(),reverse(),find()等STL方法
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int T;
cin>>T;
for(int i=0; i<T; i++) {
int n;
cin>>n;
string s[n];
int minLen = 101;
int index = -1;
for(int j=0; j<n; j++) {
cin>>s[j];
if(s[j].length()<minLen) {
minLen = s[j].length();
index = j;
}
}
int ans = 0;
for(int i=minLen; i>=0; i--) {
for(int j=0; j<s[index].length()-i+1; j++) {
string sub = s[index].substr(j, i);
string subRev = sub;
reverse(subRev.begin(), subRev.end());
int k = 0;
for(k=0; k<n; k++) {
if(s[k].find(sub)==-1 && s[k].find(subRev)==-1) {
break;
}
}
if(k==n) {
ans = max(ans, i);
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}