//QQ:54573339
来源:牛客网
题目描述
小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的。所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意。现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾。那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少。
来源:牛客网
输入描述:
一行一个字符串表示给定的字符串S
示例1
输入
复制
dcbaabc
输出
复制
7
说明
将前面的dcba移动到末尾变成abcdcba,这个字符串的最大回文子串就是它本身,长度为7
这个题我的思路是将这个字符串扩展为原来的2倍;
然后就可以通过最简单的比对就OK了;当然大佬可以用动态规划,或者另一个定理(
https://www.jianshu.com/p/c82cada7e5b0),因为这个定理只是对回文串管用,所以我没太做深入的研究;
#include <iostream>
using namespace std;
#include <string>
int main()
{
string s;
cin>>s;
s=s+s;
int n=s.size()/2;
int len=1;
for(int i=0;i<n;i++)
{
for(int j=n+i-1;j>i;j--)
{
if(s[i]==s[j])
{
bool tf=false;
for(int k=i,l=j;k<=l;k++,l--)
{
if(s[k]!=s[l])
{
tf=true;
break;
}
}
if(!tf)
{
len=max(len,j-i+1);
}
}
}
}
cout<<len<<endl;
return 0;
}
我感觉我这是最简单最粗暴的做法了;
如果哪里不对,希望大佬们指教一下;