leetcode 5 最长回文子串

本文介绍了一种使用中心扩展法寻找字符串中最长回文子串的方法,通过两次遍历,分别处理中心为单字符和双字符的情况,实现了高效查找。同时,文章提及了Manacher算法,并推荐了一个详细解释该算法的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:我们考虑一个子串s,如果s不是个回文串,那么就不用考虑在a+s+a是不是回文串了,直接break;

另一个要注意的点是:起始中心子串有两种长度:1个或者2个---------------看了leetcode官方题解,这个应该是中心扩展法。

class Solution {
public:
string longestPalindrome(string s) {
	int N = s.length();
	int start=0;
	int end = 0;
	for (int i = 0; i < N-1; i++) {
		if (s[i] == s[i + 1]) {
			start = i;
			end = i + 1;
		}
	}
	for (int i = 1; i < N-1; i++) {
		for (int j = 1; i-j>=0 && i+j<N ; j++) {
			if (s[i - j] == s[i + j]) {
				if (2 * j > end - start) {
					start = i - j;
					end = i + j;
				}
			}
			else
				break;
		}
	}
	for (int i = 1; i < N - 2; i++) {
		if (s[i]!=s[i+1])
			continue;
		for (int j = 1; i - j >= 0 && i + j<N; j++) {  		
			if (s[i - j] == s[i + j + 1]) {
				if (2 * j + 1 > end - start) {
					start = i - j;
					end = i + j + 1;
				}
			}
			else
				break;
		}
	}
	return s.substr(start,end-start+1);
}
};

 

官方题解提到了manacher解法,但是没有具体讲怎么做的。

这个链接讲的挺好的,马拉车算法漫画对白讲解版 自己去打开看看,关注下公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值