7-11 最长对称子串
分数 15
作者 陈越
单位 浙江大学
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
参考代码
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{
//输入
char str[1002];
cin.getline(str, 1002);//可存储空格,遇到回车会结束,最多1001个字符 + 一个‘\0'
int L = strlen(str);
//特殊情况
if (L == 1 || (L == 2 && str[0] != str[1]))
{
cout << "1" << endl;
return 0;
}
//step1:找到所有的对称子串
int center1[1002];//奇数长度对称中心
int center2[1002];//偶数长度对称中心(靠左)
int count1 = 0;
int count2 = 0;
for (int i = 0; i < L; i++)
{
if (i > 0 && i < L - 1 && str[i - 1] == str[i + 1])
{
center1[count1] = i;
count1++;
}
if (i < L - 1 && str[i] == str[i + 1])
{
center2[count2] = i;
count2++;
}
}
//step2:计算每个子串长度
int len1[1002];
int len2[1002];
for (int i = 0; i < count1; i++)//计算奇数长度
{
len1[i] = 1;
int left = center1[i]-1;
int right = center1[i]+1;
while (left>=0 && right<L && str[left] == str[right])
{
len1[i]+=2;
left--;
right++;
}
}
for (int i = 0; i < count2; i++)//计算偶数长度
{
len2[i] = 0;
int left = center2[i];
int right = center2[i] + 1;
while (left >= 0 && right < L && str[left] == str[right])
{
len2[i] += 2;
left--;
right++;
}
}
//step3:分别找到最大长度
int max1 = 1;//有可能是abcdef,没有对称子串,那么最大是1
int max2 = 1;
for (int i = 0; i < count1; i++)
{
if (len1[i] > max1)
{
max1 = len1[i];
}
}
for (int i = 0; i < count2; i++)
{
if (len2[i] > max2)
{
max2 = len2[i];
}
}
//输出
cout << (max1 > max2 ? max1 : max2) << endl;
return 0;
}
标签:11,子串,str,int,++,max2,&&,对称
From: https://www.cnblogs.com/yesno233233/p/18064244