回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 1000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
解法一:
暴力枚举所有串
若当前枚举串长度大于已知最大回文串
传到函数里判断是否是回文串
#include <iostream>
using namespace std;
bool fun(string x,int len)
{
for(int i = 0, j = len - 1; i <len / 2; i++, j--)
{
if(x[i] != x[j])
return false;
}
return true;
}
int main()
{
ios::sync_with_stdio(false);
string text,tmp;
int maxlen = 1, len;
cin>>text;
for(int i = 0; i < text.length(); i++)
{
tmp = text[i];
for(int j = i + 1; j < text.length(); j++)
{
tmp = tmp + text[j];
len = tmp.length();
if(len > maxlen)
{
if(fun(tmp,len))
{
maxlen = len;
}
}
//cout<<tmp<<' '<<len<<endl;
//cout<<fun(tmp,len)<<endl;
}
}
cout<<maxlen<<endl;
return 0;
}
解法二:
若连着两个字符相等
如aa 则初始长度为2
前后枚举是否相等 长度每次加2;
若隔一个字符相等 如aba 则初始长度为3
前后枚举是否相等 长度每次加2;
比较求解
时间可以控制在15ms内
#include <iostream>
using namespace std;
int main()
{
string a;
cin>>a;
int maxlen = 1, tmplen = 0, alen = a.length();
int fst, lst;
for(int i = 0; i < alen; i++)
{
if(a[i] == a[i + 1])
{
tmplen = 2;
fst = i - 1;
lst = i + 2;
while(a[fst] == a[lst] && fst >= 0 && lst < alen)
{
tmplen += 2;
fst--;
lst++;
}
}
if(tmplen > maxlen)
{
maxlen = tmplen;
}
if(a[i - 1] == a[i + 1])
{
tmplen = 3;
fst = i - 2;
lst = i + 2;
while(a[fst] == a[lst] && fst >= 0 && lst <= alen)
{
tmplen += 2;
fst--;
lst++;
}
}
if(tmplen > maxlen)
{
maxlen = tmplen;
}
}
cout<<maxlen<<endl;
return 0;
}