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 存储状态。

相关推荐
yi0115 分钟前
DAY27: LeetCode 110. 平衡二叉树 | 在递归中判断是否平衡
人工智能·笔记·python·算法·leetcode·二叉树·递归
西瓜很甜哟14 分钟前
golang实现大文件分片上传
后端·golang·html
96245621 分钟前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
xuxigifxfh44 分钟前
牛客:HJ21 简单密码
java·开发语言·算法
qq_408606861 小时前
确界的倒数性质证明
学习·算法
小蒋观天下1 小时前
【安防AI工程实战二】AI摄像头帧率抖动根治:ISP曝光时序与AI推理时序冲突深度定位
人工智能·深度学习·算法·安全·机器学习·ai大模型
云和数据.ChenGuang1 小时前
trace 是RAG检索链路的**全链路追踪日志对象
人工智能·深度学习·算法·排序算法
Evand J1 小时前
【PMSM例程6】永磁同步电机(PMSM)基于增广EKF的d-q轴电感分阶段辨识算法|电机参数估计与误差分析
算法·matlab·电机·ekf
垆边人似月.1 小时前
华为题:最多可以参加的会议数目
数据结构·c++·算法
Matlab程序猿1 小时前
【MATLAB源码-第460期】基于matlab的OTFS通信系统SLM峰均比抑制及非线性功率放大器失真与误码性能仿真
开发语言·算法·matlab·slm·otfs