因为本题只有100,暴力是可以过的,思想就是枚举它的所有>2的回文子串,然后将他们按长度大小进排序 ok上代码
using namespace std;
const int N=300;
string s1[N];
bool cmp(string a,string b)
{
return a.size()<b.size();
}
bool check(string s)
{
string s3="";
for(int i=s.size()-1;i>=0;i--)
{
s3+=s[i];
}
if(s3==s) return true;
else return false;
}
int main()
{
string s;
int x=0;
cin>>s;
for(int i=0;i<s.size()-1;i++)
{
string s2="";
s2+=s[i];
for(int j=i+1;j<s.size();j++)
{
s2+=s[j];
if(check(s2))
{
s1[x]=s2;
x++;
}
else
{
continue;
}
}
}
sort(s1,s1+x,cmp);
if(s1[0].size()==0) cout<<"-1"<<endl;
else
{
cout<<s1[0].size()<<endl;
}
return 0;
}
是不是太过暴力了,但本题也是有规律的,那规律是什么呢。 举个例子:abcba是长度为5的回文串,但它还包含了bcb这个长度为3的回文子串 在来一个:abba是长度为4的回文串,但它包含了bb这个长度为2的回文子串 所以不管这个字符串提取了多少长度的回文子串,它最小的长度要么是3或2. 现在就很明白了,此题只能输出-1 2 3 上代码
```#include<bits/stdc++.h>
using namespace std;
// aa aba 如果是4个abba 这样中间就有bb了 5个呢 abcba 3个
//所以 只有3种情况 -1,2,3
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size()-1;i++)
{
if(s[i]==s[i+1])
{
cout<<"2\n";
return 0;
}
}
for(int i=0;i<s.size()-2;i++)
{
if(s[i]==s[i+2])
{
cout<<"3\n";
return 0;
}
}
cout<<"-1\n";
return 0;
}
真的简洁不少