一、题目描述
原题链接
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
二、解题思路
这道题主要是要找出最大对称子串的大小,我的思路是这样的:遍历字符串中的所有字符,以这个字符为中心,向左右两边扩展,将所得字符串用reverse函数翻转,看是否与原来相同,但是要注意的是这里子串要分奇偶两种情况讨论,用ans存储当前对称子串的最大长度,进行更新即可。
三、AC代码
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
bool check(string str, int i, int r, int isOdd)
{
if(r == 0) return true;
if(isOdd == 0)
{
if(i+1-r<0) return false;
string tmp1 = str.substr(i+1-r, r);
string tmp2 = str.substr(i+1, r);
reverse(tmp2.begin(), tmp2.end());
if(tmp1 == tmp2) return true;
else return false;
}
else if(isOdd == 1)
{
if(i-r < 0) return false;
string tmp1 = str.substr(i-r, r);
string tmp2 = str.substr(i+1, r);
reverse(tmp2.begin(), tmp2.end());
if(tmp1 == tmp2) return true;
else return false;
}
}
int main()
{
int ans=0;
string str;
getline(cin, str);
int sze = str.length();
for(int i=0; i<sze; i++)
{
for(int r=0; r<=min(sze-i-1, i+1); r++)
{
if(check(str, i, r, 0) && 2*r > ans) ans = r*2;
if(check(str, i, r, 1) && 2*r + 1 > ans) ans = r*2+1;
}
}
printf("%d", ans);
return 0;
}