最长回文子串 - 贪心(错误)
贪心是错的!缺少考虑 anana
的情况
func longestPalindrome(s string) string {
n := len(s)
if n == 0 {
return ""
}
start := 0
maxLen := 1
// dp[i]: 以 i 结尾的最长回文子串长度
dp := make([]int, n)
// equal[i]: 以 i 结尾的最长回文子串的内容是否是同一字符
equal := make([]bool, n)
for i := range dp {
dp[i] = 1
}
for i := 1; i < n; i++ {
if s[i] == s[i - 1] {
if equal[i - 1] {
dp[i] = dp[i - 1] + 1
} else {
dp[i] = 2
}
equal[i] = true
}
if i - dp[i - 1] - 1 >= 0 && s[i] == s[i - dp[i - 1] - 1] {
if dp[i - 1] + 2 > dp[i] {
dp[i] = dp[i - 1] + 2
equal[i] = false
}
}
if dp[i] > maxLen {
maxLen = dp[i]
start = i - dp[i] + 1
}
}
return s[start:start + maxLen]
}