1. 暴力解法
// 暴力解法func longestPalindrome(s string) string {maxLen := 0maxString := ""for i := 0; i < len(s); i++{for j := i + 1; j <= len(s); j++{if isPalindrome(s[i:j]) && len(s[i:j]) > maxLen{maxString = s[i:j]maxLen = len(s[i:j])}}}return maxString}func isPalindrome1(s string) bool {len := len(s)for i := 0; i < len / 2; i++{if s[i] != s[len-i-1]{return false}}return true}func longestPalindrome1(s string) string {var maxLen intvar maxStr stringfor i := 0; i < len(s); i++ {for j := i + 1; j < len(s)+1; j++ {len := isPalindrome1(s[i:j])if len > maxLen {maxStr = s[i:j]maxLen = len}}}return maxStr}func isPalindrome1(s string) int {var newStr stringfor i := len(s)-1; i >= 0; i--{newStr += s[i:i+1]}if s == newStr {return len(s)}return 0}
时间复杂度:两层 for 循环 O(n²),for 循环里边判断是否为回文 O(n),所以时间复杂度为 O(n³)。
空间复杂度:O(1),常数个变量。
2. 动态规划
func longestPalindrome(s string) string {if len(s) < 2{return s}//状态容器dp := make([][]bool, len(s))for i := range dp {dp[i] = make([]bool, len(s))}for i := 0; i < len(s); i++{dp[i][i] = true}maxLen := 1begin := 0for j := 1; j < len(s); j++{for i := 0; i < len(s) - 1 && i < j; i++{if s[i] != s[j]{dp[i][j] = false}else{if j - i < 3{dp[i][j] = true}else{dp[i][j] = dp[i+1][j-1]}}// 只要 dp[i][j] == true 成立,就表示子串 s[i..j] 是回文,此时记录回文长度和起始位置if dp[i][j] && j - i + 1 > maxLen{maxLen = j - i + 1begin = i}}}return s[begin:begin+maxLen]}

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
