首页

算法-最长回文

一、最长回文

难度:中等

题目传送门:最长回文

题目

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

示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:
输入:s = "cbbd"
输出:"bb"

提示:

  1. 1 <= s.length <= 1000
  2. s 仅由数字和英文字母组成

思路

从左向右,每次选一个字符作为回文的中点,然后向两边扩散,计算对称的长度.

因为子串长度可能是偶数,那么中间点就是相邻的两个数。

代码

func longestPalindrome(s string) string {
	if s == "" {
		return ""
	}
	// 从左向右,每次选一个字符作为回文的中点,然后向两边扩散,计算对称的长度
	// 因为子串长度可能是偶数,那么中间点就是相邻的两个数。
	left, right := 0, 0

	for i := 0; i < len(s); i++ {
		// 奇数
		len1 := search(s, i, i)
		// 偶数
		len2 := search(s, i, i+1)
		maxLen := len1
		if len1 < len2 {
			maxLen = len2
		}
		if right-left+1 < maxLen {
			left = i - (maxLen-1)/2
			right = i + maxLen/2
		}
	}
	return s[left : right+1]
}

func search(s string, left, right int) int {
	for left >= 0 && right < len(s) {
		if s[left] != s[right] {
			break
		}
		left--
		right++
	}
	return right - left - 1
}