对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路 :设一个数组a储存字符串,共历遍 strlen(a)-2次(最后一个字符可省略),假设历遍到第z个字符,那么要考虑两种情况,一种是aaaa型回文,另一种是aabaa型回文,假设z1 = z , z2 = z+1;如果a[z1]==a[z2]那么继续循环{z1--;z2++}判断接下来的字符是否相等,最后z2-z1-1为以z为“核心”的回文长度
#include "iostream"
#include "string.h"
using namespace std;
int main()
{
char a[1001];
cin.getline(a,1001);
int num=1 , len = strlen(a); // num 为对称字段长度,至少为1
/* 开始循环历遍 */
for(int z=0;z<len-1;z++)
{
int z1=-2,z2=z+1; // z1==-2 用于下方判断
if(a[z]==a[z2]) z1 = z; // 回文字符串为偶数个
else if(z<len-2 && a[z]==a[++z2]) z1 = z; // 回文字符串为奇数个
while (z1>=0 && z2 < len )
{
if(a[z1]==a[z2])
{
z1--;
z2++;
continue;
}
break;
}
if(z2 - z1>num && z1!=-2) num = z2-z1-1; // 因为z1-- 和 z2++会多执行一次,所以这里要多减一个1
}
cout << num;
return 0;
}