前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5. 最长回文子串

5. 最长回文子串

原创
作者头像
Michel_Rolle
发布2024-02-11 11:51:22
6160
发布2024-02-11 11:51:22
举报
文章被收录于专栏:LeetCode解题LeetCode解题

link

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

Example 1:

代码语言:javascript
复制
Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer.
代码语言:javascript
复制
输入: "cbbd"
输出: "bb"
代码语言:javascript
复制
func longestPalindrome(s string) string {
	if len(s) < 2 { // 肯定是回文,直接返回
		return s
	}

	// 最长回文的首字符索引,和最长回文的长度
	begin, maxLen := 0, 1

	// 在 for 循环中
	// b 代表回文的**首**字符索引号,
	// e 代表回文的**尾**字符索引号,
	// i 代表回文`正中间段`首字符的索引号
	// 在每一次for循环中
	// 先从i开始,利用`正中间段`所有字符相同的特性,让b,e分别指向`正中间段`的首尾
	// 再从`正中间段`向两边扩张,让b,e分别指向此`正中间段`为中心的最长回文的首尾
	for i := 0; i < len(s); { // 以s[i]为`正中间段`首字符开始寻找最长回文。
		if len(s)-i <= maxLen/2 {
			// 因为i是回文`正中间段`首字符的索引号
			// 假设此时能找到的最长回文的长度为l, 则,l <= (len(s)-i)*2 - 1
			// 如果,len(s)-i <= maxLen/2 成立
			// 则,l <= maxLen - 1
			// 则,l < maxLen
			// 所以,无需再找下去了。
			break
		}

		b, e := i, i
		for e < len(s)-1 && s[e+1] == s[e] {
			e++
			// 循环结束后,s[b:e+1]是一串相同的字符串
		}

		// 下一个回文的`正中间段`的首字符只会是s[e+1]
		// 为下一次循环做准备
		i = e + 1

		for e < len(s)-1 && b > 0 && s[e+1] == s[b-1] {
			e++
			b--
			// 循环结束后,s[b:e+1]是这次能找到的最长回文。
		}

		newLen := e + 1 - b
		// 创新记录的话,就更新记录
		if newLen > maxLen {
			begin = b
			maxLen = newLen
		}
	}

	return s[begin : begin+maxLen]
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com