- tags: LeetCode
> https://leetcode.com/problems/longest-palindromic-substring/description/
思路
直接暴力往两边搜索
func longestPalindrome(s string) string {
buf := []byte(s)
length := len(buf)
if length == 0 {
return s
}
start, end := 0, 0
for ci, _ := range buf {
i, j := ci, ci
// 无法处理 "aaaa" 和 "noon" 这种情况
for i > 0 && j < length - 1 && buf[i - 1] == buf[j + 1] {
i--
j++
}
// 考虑 "bba" 这种情况
if i == j && ci > 0 && buf[ci] == buf[ci - 1] {
i, j = ci-1, ci
}
// 考虑 "abb" 这种情况
if i == j && ci < length - 1 && buf[ci] == buf[ci + 1] {
i, j = ci, ci + 1
}
if i != j && j - i >= end - start {
start, end = i, j
}
}
return string(buf[start:end + 1])
}
上面代码无法处理 “aaaa” 和 “noon” 这种情况,只要把下面处理 “bba” 和 “abb” 情况的代码放到上面即可
func longestPalindrome(s string) string {
buf := []byte(s)
length := len(buf)
if length == 0 {
return s
}
start, end := 0, 0
for ci, _ := range buf {
i, j := ci, ci
if i == j && ci > 0 && buf[ci] == buf[ci - 1] {
i, j = ci-1, ci
}
if i == j && ci < length - 1 && buf[ci] == buf[ci + 1] {
i, j = ci, ci + 1
}
for i > 0 && j < length - 1 && buf[i - 1] == buf[j + 1] {
i--
j++
}
if i != j && j - i >= end - start {
start, end = i, j
}
}
return string(buf[start:end + 1])
}
但上面又导致 “ccc” 无法处理,所以需要处理两种情况:
- 以当前字符为中心向两边扩散
- 以当前字符和下一个字符为中心向两边扩散
对比以上两个结果取大的那个,调整后如下
func longestPalindrome(s string) string {
buf := []byte(s)
length := len(buf)
if length == 0 {
return s
}
start, end := 0, 0
for ci, _ := range buf {
i, j := ci, ci
for i > 0 && j < length - 1 && buf[i - 1] == buf[j + 1] {
i--
j++
}
if i != j && j - i >= end - start {
start, end = i, j
}
i, j = ci, ci + 1
if j < length && buf[i] == buf[j] {
for i > 0 && j < length - 1 && buf[i - 1] == buf[j + 1] {
i--
j++
}
if i != j && j - i >= end - start {
start, end = i, j
}
}
}
return string(buf[start:end + 1])
}