Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example 2:
Input: “cbbd”
Output: “bb”
解题思路
- 通过添加 # 消除不必要的奇偶判断
- 使用动态规划减少运算(dp 数组记录中间结果)
import "strings"
func longestPalindrome(s string) string {
if len(s) <= 1 {
return s
}
ss := "#"
for _, c := range s {
ss += string(c) + "#"
}
// 动态规划
dp := make([]int, len(ss))
dp[0] = 1
dp[1] = 2
maxLen := 2
maxIndex := 1
for i := 2; i < len(ss); i++ {
if i < (maxIndex + maxLen - 1) {
mirror := 2*maxIndex - i
if dp[mirror]-1+i < maxIndex+maxLen-1 {
dp[i] = dp[mirror]
} else {
j := 0
for j = maxIndex + maxLen; j < len(ss) && 2*i-j >= 0; j++ {
if ss[2*i-j] != ss[j] {
break
}
}
dp[i] = dp[2*maxIndex-i] + j - (maxIndex + maxLen)
if dp[i] > maxLen {
maxLen = dp[i]
maxIndex = i
}
}
} else {
j := 0
for j = i + 1; j < len(ss) && 2*i-j >= 0; j++ {
if ss[2*i-j] != ss[j] {
break
}
}
dp[i] = j - i
if dp[i] > maxLen {
maxLen = dp[i]
maxIndex = i
}
}
}
return strings.Replace(ss[maxIndex-maxLen+1:maxIndex+maxLen], "#", "", -1)
}