一、最长回文
难度:中等
题目传送门:最长回文
题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
- 1 <= s.length <= 1000
- 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
}