L2-008 最长对称子串

题目描述

给出一个长度不超过1000的非空字符串,请你找出其中最长的连续对称子串的长度。

输入示例:

Is PAT&TAP symmetric?

输出示例:

11

解题思路

  1. 暴力一定超时

  2. 对称子串分奇偶,我们不妨枚举奇偶长度,对每一个位置,向两边延伸,分别形成长度为奇数的字符串和长度为偶数的字符串,看他们是否对称,如果枚举某个长度时不对称了就记录之前的最大长度,并跳到下一个点,这样的做法显然比暴力快很多。

  • 对于奇数串,每次延伸的时候,是一个向左,一个向右,那我们可以用两个指针,奇数串长度从1开始,所以两个指针初始状态就是该对称中心i

  • 对于偶数串,同样是两个指针,由于偶数串长度从2开始,所以可以令左指针从i开始,右指针从i + 1开始 , 同时向两边延伸

  1. manacher算法(前面的算法以后再来探索吧😋(#.#))

ac✅️代码(这个代码比柳婼大大的好一点)

#include<iostream>
#include<algorithm>
using namespace std;
using namespace std;
int getlen(const string&s,int L,int R)
{
	while(L>=0 && R<s.size()&&s[L] == s[R])
	{
		L--,R++;
	}
	return R-L-1;
}

int main()
{
	string s;
	getline(cin,s);
	int max_len = 0;
	for(int i = 0 ; i < s.size() ; i++)
	{
		int len1 = getlen(s,i,i);
		int len2 = getlen(s,i,i+1);
		max_len = max({max_len,len1,len2});
	}
	cout<<max_len<<endl;
	return 0;
}

o( ̄︶ ̄)o

posted @ 2026-03-14 19:44  shuiwangrenjia  阅读(4)  评论(0)    收藏  举报