Problem: 5. 最长回文子串
思路:动态规划
最长回文子串:dp[i][j],以i开头j结尾的串是不是回文子串
递推公式:dp[i][j]是不是回文串,dp[i][j] = s[i] == s[j] && dp[i+1][j-1]是否是回文串。如果串长度<= 3就判断左右边字符是否相同。
初始化:dp[i][j] = true,其中 i== j
遍历顺序:斜下方遍历,然后向右平移。这个遍历顺序可以把dp[i+1][j-1] 用之前初始化
初始化:caba
Code
func longestPalindrome(s string) string {
dp := make([][]bool, len(s))
for i := 0; i < len(s); i++ {
dp[i] = make([]bool, len(s))
dp[i][i] = true // 根据case 1 初始数据
}
max := 0
str := s[0:1]
for j := 0; j < len(s); j++ {
for i, k := 0, j; i <= k && k < len(s); k++ {
if s[i] == s[k] {
if k-i < 3 {
dp[i][k] = true
if max < k-i+1 {
max = k - i + 1
str = s[i : k+1]
}
} else {
dp[i][k] = dp[i+1][k-1]
if dp[i][k] && max < k-i+1 {
max = k - i + 1
str = s[i : k+1]
}
}
}
i++
}
}
return str
}