最长回文子串
题目描述
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
解题思路
这个问题可以通过动态规划或中心扩展等方法解决。这里采用的是中心扩展的方法。
中心扩展法
中心扩展法的基本思想是:以字符串中的每一个字符为中心(包括字符间的空隙,例如,字符串 “abc” 中有 “a”, “b”, “c” 和 “a” 与 “b” 之间的空隙,“b” 与 “c” 之间的空隙),向两边扩展,寻找最长的回文子串。
算法步骤
- 初始化最长回文子串的起始位置
maxstart
和结束位置maxend
,以及最长回文子串的长度max
。 - 遍历字符串
s
,对于每个位置i
,尝试以i
和i+1
为中心扩展,寻找偶数长度的回文子串。 - 同时,尝试以
i
为中心扩展,寻找奇数长度的回文子串。 - 在扩展过程中,如果发现更长的回文子串,则更新
maxstart
、maxend
和max
。 - 最后,根据
maxstart
和maxend
返回最长回文子串。
代码实现
package main
func longestPalindrome(s string) string {
if len(s) < 2 {
return s
}
left, right := 0, 0
max := 0
maxstart := 0
maxend := 0
for i := 0; i < len(s); i++ {
left = i
right = i + 1
for left >= 0 && right < len(s) && s[left] == s[right] {
right++
}
right--
for left >= 0 && right < len(s) && s[left] == s[right] {
left--
right++
}
left++
right--
if max < right-left {
max = right - left
maxstart = left
maxend = right
}
}
return s[maxstart : maxend+1]
}
复杂度分析
- 时间复杂度:O(n^2),其中
n
是字符串的长度。外层循环遍历每个字符,内层循环进行中心扩展,最坏情况下每次扩展都会遍历整个字符串。 - 空间复杂度:O(1),只使用了常数个变量。