L2-008. 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定”Is PAT&TAP symmetric?”,最长对称子串为”s PAT&TAP s”,于是你应该输出11。
题目描述
输入在一行中给出长度不超过1000的非空字符串。
Iutput
输入在一行中给出长度不超过1000的非空字符串。
Output
在一行中输出最长对称子串的长度。
Sample Input
Is PAT&TAP symmetric?
Sample Output
11
思路:
以字符串的各个元素为起点,向两边扩展,寻找对称的字串,注意,要注意字串的长度,可能为奇数也可能为偶数,所以确定左右扩展起点时要处理一下。
另外,了解到还有一种时间复杂度为O(n)的Manacher算法
http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html
代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn=1005;
char str[maxn];
int leni[maxn],len;
int subString(int k)
{
int L1,L2,length;
L1=L2=length=1;
int left=k-1,right=k+1; //字串长度为奇数,向两边扩展的起点
while(left>=0&&right<len){
if(str[left--]==str[right++])
L1+=2;
else break;
}
left=k,right=k+1; //字串长度为偶数;
while(left>=0&&right<len){
if(str[left--]==str[right++])
L2+=2;
else break;
}
L2--;
length=L1>L2?L1:L2;
return length;
}
int main()
{
gets(str);
len=strlen(str);
memset(leni,1,sizeof(leni));
int maxL=1;
for(int i=0;i<len-1;i++){
leni[i]=subString(i);
if(leni[i]>=maxL)
maxL=leni[i];
}
printf("%d\n",maxL);
return 0;
}