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

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"

输出: "bab"

注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"

输出: "bb"

本算法采用 动态规划去解析

复制代码
func longestPalindrome(s string) string {
    n :=len(s)
    dp :=make([][]int,n)
    for i:=0;i<n;i++{
        dp[i] = make([]int,n)
    }
    
    ans := ""
    for k:=0;k<n;k++{
        for i:=0;i+k<n;i++{
            j:=i+k
            if k == 0 {
                dp[i][j] = 1
            }else if k == 1 {
                if s[i] == s[j] {
                    dp[i][j] = 1
                }
            }else {
                if s[i] == s[j] {
                    dp[i][j] = dp[i+1][j-1]
                }   
            }
            if dp[i][j] == 1 && k+1 > len(ans){
                ans = s[i:j+1]
            }
        }
    }
    return ans
}

代码解析:

  1. 初始化二维 DP 表格

    n := len(s)
    dp := make([][]int, n)
    for i := 0; i < n; i++ {
    dp[i] = make([]int, n)
    }

功能:

dpij 表示子串 si:j+1 是否是回文子串。值为 1 表示是回文,0 表示不是。

初始化一个大小为 n × n 的二维数组 dp,用于存储所有子串的回文状态。

  1. 遍历子串长度 k(主循环)

    for k := 0; k < n; k++ {
    for i := 0; i+k < n; i++ {
    j := i + k
    ...
    }
    }

功能:

遍历所有可能的子串长度 k(k+1 是实际长度)。

i 是子串的起始位置,j = i + k 是子串的结束位置。

子串的范围是 si:j+1

  1. 判断子串是否是回文

    if k == 0 {
    dp[i][j] = 1
    } else if k == 1 {
    if s[i] == s[j] {
    dp[i][j] = 1
    }
    } else {
    if s[i] == s[j] {
    dp[i][j] = dp[i+1][j-1]
    }
    }

功能:

根据子串长度的不同情况,判断是否为回文:

长度为 1(k == 0):

单个字符总是回文,直接标记为 1。

长度为 2(k == 1):

如果两个字符相等,则是回文。

长度大于 2(k > 1):

首尾字符相等,且去掉首尾的子串 si+1:j 也为回文(通过 dpi+1j-1 判断)。

  1. 更新答案

    if dp[i][j] == 1 && k+1 > len(ans) {
    ans = s[i : j+1]
    }

功能:

如果当前子串 si:j+1 是回文且长度超过当前记录的最长回文,则更新答案 ans。

k+1 是子串的实际长度。

完整运行流程示例

假设输入字符串为 s = "babad":

初始化 dp 矩阵为全 0,ans = ""。

遍历所有可能的子串:

子串长度 k = 0:

每个单字符都是回文,如 dp00 = 1,dp11 = 1。

子串长度 k = 1:

检查相邻字符是否相等。如 s0:2 = "ba" 不是回文,但 s1:3 = "aba" 是回文。

子串长度 k = 2:

检查三字符回文,通过 dpi+1j-1 判断。

每次找到更长的回文时,更新答案。

最终结果为 "bab" 或 "aba"。

复杂度分析

时间复杂度:O(n²)

遍历子串的起点 i 和长度 k。

空间复杂度:O(n²)

使用了一个二维数组 dp 存储状态。

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