Longest Palindromic Substring
题目描述
给出一个字符串,让你求出它的最长回文子串。如abac
输出aba
。
题目思路
刚开始想着用动态规划来做,最小时间花费也要 O ( n 2 ) O(n^2) O(n2),并且需要维护一个辅助数组,用来标记当前i-j是不是回文子串。提交一看,排名停靠后的。然后看了下比较快的思路。分为奇偶做法,每次选定一个中心,由中心往外扩散,求得最长的回文子串。代码如下。
func longestPalindrome(s string) string {
slen := len(s)
if slen == 0 {
return s
}
var left, right int
for i := 0; i < slen; i++ {
l1, r1 := expandOdd(s, i)
l2, r2 := expandEven(s, i)
if r1 - l1 >= right - left {
left, right = l1, r1
}
if r2 - l2 >= right - left {
left, right = l2, r2
}
}
return s[left:right+1]
}
func expandOdd(s string, i int) (left, right int) {
for interval := 0; i - interval >= 0 && i + interval < len(s); interval++ {
if s[i-interval] != s[i+interval] {
break
}
left, right = i - interval, i + interval
}
return
}
func expandEven(s string, i int) (left, right int) {
for interval := 0; i - interval >= 0 && i + interval + 1 < len(s); interval++ {
if s[i-interval] != s[i+interval+1] {
break
}
left, right = i - interval, i + interval + 1
}
return
}
看到解题过程,还有种叫做Manacher's Algorithm
的方法。后续先了解该算法再补上。