在编程面试和实际开发中,最长回文子串是一个经典问题。本文将使用Go语言带你一步步理解并实现该算法,即使你是编程新手,也能轻松掌握!
回文字符串是指正着读和反着读都一样的字符串。例如:"aba"、"abba"、"racecar" 都是回文。
给定一个字符串 s,找出其中最长的回文子串。例如:
"babad" → 输出:"bab" 或 "aba""cbbd" → 输出:"bb"
最直观的方法是检查所有可能的子串,判断是否为回文,并记录最长的那个。
func isPalindrome(s string) bool { left, right := 0, len(s)-1 for left < right { if s[left] != s[right] { return false } left++ right-- } return true}func longestPalindromeBrute(s string) string { n := len(s) if n == 0 { return "" } maxLen := 1 start := 0 for i := 0; i < n; i++ { for j := i; j < n; j++ { substr := s[i : j+1] if isPalindrome(substr) && len(substr) > maxLen { maxLen = len(substr) start = i } } } return s[start : start+maxLen]} 这种方法时间复杂度为 O(n³),效率较低,但逻辑清晰,适合初学者理解。
回文串有“中心对称”的特性。我们可以遍历每个字符(以及每两个字符之间),以它为中心向两边扩展,找到最长回文。
注意:回文长度可能是奇数(如 "aba")或偶数(如 "abba"),所以要分别处理。
func expandAroundCenter(s string, left, right int) int { for left >= 0 && right < len(s) && s[left] == s[right] { left-- right++ } // 返回回文长度 return right - left - 1}func longestPalindrome(s string) string { if len(s) == 0 { return "" } start, end := 0, 0 for i := 0; i < len(s); i++ { len1 := expandAroundCenter(s, i, i) // 奇数长度 len2 := expandAroundCenter(s, i, i+1) // 偶数长度 maxLen := len1 if len2 > maxLen { maxLen = len2 } if maxLen > end-start { start = i - (maxLen-1)/2 end = i + maxLen/2 } } return s[start : end+1]} 该方法时间复杂度为 O(n²),空间复杂度 O(1),是面试中最常被接受的解法。
package mainimport "fmt"// 此处插入上面的 longestPalindrome 函数func main() { testCases := []string{"babad", "cbbd", "a", "ac", "racecar"} for _, s := range testCases { result := longestPalindrome(s) fmt.Printf("输入: %s → 最长回文子串: %s\n", s, result) }} 通过本文,你已经掌握了使用 Go语言 解决 最长回文子串 问题的两种方法。对于初学者,建议先理解暴力法,再掌握更高效的中心扩展法。
这些技巧不仅适用于面试,也体现了 字符串算法 的核心思想——利用问题的对称性或结构特性来优化解法。
继续练习类似问题(如最长公共子串、编辑距离等),你的 回文字符串 和字符串处理能力会越来越强!
本文由主机测评网于2025-12-05发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123440.html