7-11 最长对称子串

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;
}
posted @   yesno233233  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示