题目
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?
, the longest symmetric sub-string is s PAT&TAP s
, hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
题目大意
给出一个字符串,要求求出最长的对称的子串的长度。
思路
最长回文子串问题,先手动寻找,遍历字符串,遍历到k位置时,定义两个指针i=k-1, j=k
,如果str[i]==str[j]
,继续找i--, j++
,直到不相等为止,同时对称还有另外一种情况aba
,所以此时还要在i=k-1, j=k+1
上寻找,重复上面的过程。在寻找的过程中避免数组越界即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1001;
int main(){
char str[MAXN];
int ans = 1;
cin.getline(str, MAXN);
for(int k=1; k<strlen(str); k++){
int i = k-1, j = k, t;
if(str[i] == str[j]){
t = 0;
while(i>=0 && j<= strlen(str)){
if(str[i] == str[j]){
t += 2;
i--, j++;
}
else{
break;
}
}
ans = t > ans ? t:ans;
}
i = k-1, j = k;
if(str[i] == str[j+1]){
j++;
t = 1;
while(i>=0 && j<=strlen(str)){
if(str[i] == str[j]){
t += 2;
i--, j++;
}
else{
break;
}
}
ans = t > ans ? t:ans;
}
}
printf("%d\n", ans);
return 0;
}