题目:
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
题解:
首先我们使用中心扩展法解决,先贴代码(Go):
func longestPalindrome(s string) string {
n := len(s)
if n < 2 {
return s
}
begin, end := 0, 0 //[begin,end]
maxLen := 1
for i := 0; i < n; i++ {
curMaxLen := max(expandAroundCenter(&s, i, i), expandAroundCenter(&s, i, i+1))
if curMaxLen > maxLen {
maxLen = curMaxLen
begin = i - (maxLen-1)/2
end = begin + maxLen - 1
}
}
return s[begin : end+1]
}
func expandAroundCenter(s *string, left int, right int) int {
for ; left >= 0 && right < len(*s) && (*s)[left] == (*s)[right]; left, right = left-1, right+1 {
}
return right - left - 1
}
func max(a int, b int) int {
if a > b {
return a
}
return b
}
核心思想就是,以每个字符(奇数子串)或每两个字符(偶数子串)为中心,然后判断可形成的最大回文长度。
需要注意的是,我们在解决问题的时候,定义的变量一定要明确意义,在考虑临界条件时才能有条不紊。
另外还有动态规划的解法,有个类似的题目,我们有一篇文章详细介绍了动态规划以及进一步的空间优化,跟该题高度相似,可以查看这里。
复杂度分析:
时间复杂度: O(n^2)
。遍历所有中心需要花费 O(n)
的时间,每个中心判断最大回文长度花费O(n)
时间,总体为 O(n^2)
。
空间复杂度: O(1)
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。