L2-008. 最长对称子串
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:Is PAT&TAP symmetric?输出样例:
11
首先要一个一个看字符串中的字符:
对于第 i 个字符 str[i] ,假如回文子串是奇数个字符,那么考虑以i为中心,同时向左向右扩展,直到发现对称位置字符不相等,假如此时共扫过x
个字符,则当前回文串长度为2*x+1。加上的1就是加上i本身。如下图所示:
由第 i 个字符a[i]构成回文偶数串。i在最接近对称轴的左侧。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include<bits/stdc++.h>
using namespace std; int main() { char a[ 1005]; while(gets(a)) { int len=- 1; int l=strlen(a); for( int i= 0; i<l; i++) { for( int j= 0; i-j>= 0&&i+j<l; j++) { ///回文串长度为奇数时 if(a[i-j]!=a[i+j]) break; if( 2*j+ 1>len) len= 2*j+ 1; } for( int j= 0; i-j>= 0&&i+j+ 1<l; j++) { ///回文串长度为偶数时 if(a[i-j]!=a[i+j+ 1]) break; if( 2*j+ 2>len) len= 2*j+ 2; } } printf( "%d\n",len); } return 0; } |