【Golang】LeetCode 5. 最长回文子串

5. 最长回文子串

题目描述

思路

题目当中给出了明确的信号"求给定字符串当中最长的回文子串",因此我们应该使用二维动态规划来解决这个问题。

为什么应该使用动态规划来解决这个问题?原因是假如我们对字符串进行暴力枚举,期间肯定会遇到很多回文子串的中间状态,在暴力枚举的过程中我们无法对中间状态进行记录(比如,从i...j这个子串构成一个回文子串,但下一次枚举无法复用了,需要重新统计一次)。使用一个二维数组来记录哪部分子串是回文子串可以大幅度降低我们求最长回文子串的时间复杂度,因为我们可以复用之前对回文子串统计的中间结果。

具体来说,我们声明一个dp bool 型二维数组,dp[i][j] == true的含义就是s[i:j]这个子串是回文子串。显然,初始情况下一定有dp[i][i] == true,原因是单个字符本身就是一个回文子串。接下来我们使用双重循环来对dp进行维护。我们在最外层循环枚举回文子串的长度currLen,在第二层循环使用i来遍历0..<n,也就是对字符串s进行遍历。显然有j == i + currLen - 1,如果s[i] == s[j],就说明s[i:j]可能构成一个回文子串。如果恰好有i == j - 1,则这两个相邻的字符构成一个子串;如果i < j - 1,那么令dp[i][j] = dp[i + 1][j - 1],如果s[i + 1][j - 1]是回文子串的话,那么dp[i + 1][j - 1] == true,就代表dp[i][j] == true,此时才构成一个回文子串。

在处理的过程中,我们在循环开始之前初始化startansLen,用于记录答案对应的最长回文子串的起点以及长度。如果dp[i][j] == true,且currLen > ansLen,则start, ansLen = i, currLen

基于以上思路,我们编程解决这道问题。

Golang 代码

go 复制代码
func longestPalindrome(s string) string {
    n := len(s)
    dp := make([][]bool, n + 1)
    for i := 0; i <= n; i ++ {
        dp[i] = make([]bool, n + 1)
        dp[i][i] = true
    }

    start, ansLen := 0, 1
    // 最长回文子串最坏情况下只包含一个字符, 因此 ansLen 至少是 1
    for currLen := 2; currLen <= n; currLen ++ {
        // 枚举子串的长度
        for i := 0; i < n; i ++ {
            j := i + currLen - 1
            if j >= n {
                break
            }
            if s[i] == s[j] {
                if i == j - 1 {
                    dp[i][j] = true
                } else {
                    dp[i][j] = dp[i + 1][j - 1]
                }
            }
            if dp[i][j] && j - i + 1 > ansLen {
                start = i
                ansLen = currLen
            }
        }
    }

    return s[start: start + ansLen]
}
相关推荐
JieE2121 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦4 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050734 天前
(一)小红的数组操作
算法·编程语言