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

ops/2024/12/17 13:50:23/

给定一个字符串 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+kif 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)
}

功能:

dp[i][j] 表示子串 s[i:j+1] 是否是回文子串。值为 1 表示是回文,0 表示不是。
初始化一个大小为 n × n 的二维数组 dp,用于存储所有子串的回文状态。
2. 遍历子串长度 k(主循环)

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

功能:

遍历所有可能的子串长度 k(k+1 是实际长度)。
i 是子串的起始位置,j = i + k 是子串的结束位置。
子串的范围是 s[i:j+1]。
3. 判断子串是否是回文

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):
首尾字符相等,且去掉首尾的子串 s[i+1:j] 也为回文(通过 dp[i+1][j-1] 判断)。

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

功能:

如果当前子串 s[i:j+1] 是回文且长度超过当前记录的最长回文,则更新答案 ans。
k+1 是子串的实际长度。

完整运行流程示例
假设输入字符串为 s = “babad”:

初始化 dp 矩阵为全 0,ans = “”。
遍历所有可能的子串:
子串长度 k = 0:
每个单字符都是回文,如 dp[0][0] = 1,dp[1][1] = 1。
子串长度 k = 1:
检查相邻字符是否相等。如 s[0:2] = “ba” 不是回文,但 s[1:3] = “aba” 是回文。
子串长度 k = 2:
检查三字符回文,通过 dp[i+1][j-1] 判断。
每次找到更长的回文时,更新答案。
最终结果为 “bab” 或 “aba”。

复杂度分析
时间复杂度:O(n²)
遍历子串的起点 i 和长度 k。
空间复杂度:O(n²)
使用了一个二维数组 dp 存储状态。


http://www.ppmy.cn/ops/142653.html

相关文章

RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10

目录 前言 一、Qt5WebEngine简介 二、Qt5WebEngine编译 总结 前言 Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

十七、临时容器kubectl debug

临时容器 一、从镜像角度看容器安全 传统架构,黑客进来,提权后,会直接操作应用,危险。 K8S,黑客从pod入侵,通过pod渗透到K8S集群,被入侵会被当做矿机,被植入sidecar 所以生产中尽量不用root账户,并且pod没有bash和sh。 二、临时容器 生产pod不建议开启bash和sh,…

校园失物招领小程序ssm+论文源码调试讲解

2.系统开发环境 2.1 JSP技术 JSP在web技术中的位置也很重要&#xff0c;对于刚进入编程行业的人们来说&#xff0c;编程语言JSP相对比较好学&#xff0c;而且也有很多高级特性[15]。在开发程序的工作中&#xff0c;jsp经常被使用到&#xff0c;例如&#xff0c;收集表单数据、…

商品订单接口获取及作用详解

引言 在电商平台的后台管理中&#xff0c;订单接口扮演着至关重要的角色。它不仅能够帮助商家实时掌握订单状态&#xff0c;还能提供订单的详细信息&#xff0c;从而优化用户体验和提高运营效率。本文将详细介绍如何获取商品订单接口&#xff0c;并解析其作用。 一、商品订单…

蓝桥杯刷题——day2

蓝桥杯刷题——day2 题目一题干题目解析代码 题目二题干解题思路代码 题目一 题干 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要…

mybatis-mysql-point-ST_GeomFromText

java mybaits 和 mysql 数据库空间坐标类型 匹配,插入使用ST_GeomFromText函数。 查询使用 ST_X 和 ST_Y函数。 先看结果:肯定能行。 数据库表 CREATE TABLE locations (id INT auto_increment PRIMARY KEY,name VARCHAR(255),coordinates POINT not null…

[Unity]【游戏开发】Shader基础8: 深入理解 Draw Call 与性能优化策略

在现代图形渲染中,Draw Call 是影响性能的重要因素之一。尽管 GPU 的渲染能力强大,但 Draw Call 的瓶颈更多地出现在 CPU 上。本文将解析 Draw Call 的概念,揭示其性能影响,并探讨有效减少 Draw Call 的优化策略,帮助开发者提高渲染效率。 什么是 Draw Call? Draw Call …