LeetCode-热题100:5. 最长回文子串

题目描述

给你一个字符串 s,找到 s 中最长的回文子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入: s = “babad”
输出: “bab”
解释: “aba” 同样是符合题意的答案。

示例 2:

输入: s = “cbbd”
输出: “bb”

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

代码及注释

func longestPalindrome(s string) string {n := len(s)// 创建一个二维数组 dp,其中 dp[i][j] 表示从字符串的第 i 个字符到第 j 个字符是否为回文串dp := make([][]bool, n)for i := range dp {dp[i] = make([]bool, n)}res := ""// l 表示回文串的长度,从 0 开始逐渐增加for l := 0; l < n; l++ {// i 表示子串的起始位置for i := 0; i < n-l; i++ {j := i + l // j 表示子串的结束位置if l == 0 {// 子串长度为 1 时,一定是回文串dp[i][j] = true} else if l == 1 {// 子串长度为 2 时,判断两个字符是否相等dp[i][j] = s[i] == s[j]} else {// 子串长度大于 2 时,判断首尾字符是否相等,并检查去掉首尾字符后的子串是否为回文串dp[i][j] = s[i] == s[j] && dp[i+1][j-1]}// 如果当前子串是回文串并且长度大于当前最长回文串的长度,则更新最长回文串if dp[i][j] && l+1 > len(res) {res = s[i : j+1]}}}return res
}

代码解释

这里使用动态规划的方法来解决最长回文子串的问题,是因为这个问题具有重叠子问题和最优子结构的特点。

  1. 重叠子问题:

    • 在寻找最长回文子串的过程中,我们可能需要多次判断子串是否为回文。例如,为了判断 dp[i][j] 是否为回文,我们可能需要先判断 dp[i+1][j-1] 是否为回文。
    • 动态规划通过存储中间结果,避免了重复计算,提高了效率。
  2. 最优子结构:

    • 如果一个字符串的首尾字符相等,并且去掉首尾字符后的子串也是回文,那么整个字符串就是回文。
    • 这种“问题的最优解包含子问题的最优解”特性使得动态规划是解决这个问题的合适方法。

代码解释:

  1. 初始化二维数组:

    n := len(s)
    dp := make([][]bool, n)
    for i := range dp {dp[i] = make([]bool, n)
    }
    
    • 创建一个二维数组 dp,其中 dp[i][j] 表示从字符串的第 i 个字符到第 j 个字符是否为回文串。
  2. 动态规划计算最长回文子串:

    for l := 0; l < n; l++ {for i := 0; i < n-l; i++ {j := i + lif l == 0 {dp[i][j] = true} else if l == 1 {dp[i][j] = s[i] == s[j]} else {dp[i][j] = s[i] == s[j] && dp[i+1][j-1]}if dp[i][j] && l+1 > len(res) {res = s[i : j+1]}}
    }
    
    • 动态规划计算最长回文子串的长度。
    • l 表示当前计算的子串长度,从 0 开始逐渐增加。
    • i 表示当前子串的起始位置,j 表示当前子串的结束位置。
    • 对于每个 ij,我们判断当前子串是否为回文,并更新最长回文子串 res
  3. 返回结果:

    return res
    
    • 返回最长回文子串 res

这个动态规划的解法时间复杂度为 O(n2),空间复杂度为 O(n2)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发学习笔记第一篇--TypeScript基础语法

目录 前言 一、ArkTS 二、基础语法 1.基础类型 1.布尔值 2.数字 3.字符串 4.数组 5.元组 6.枚举 7.unkown 8.void 9.null和undefined 10.联合类型 2.条件语句 1.if语句 1.最简单的if语句 2.if...else语句 3.if...else if....else 语句 2.switch语句 5.函数…

Java 入门教程||Java 关键字

Java 关键字 Java教程 - Java关键字 Java中的关键字完整列表 关键词是其含义由编程语言定义的词。 Java关键字和保留字&#xff1a; abstract class extends implements null strictfp true assert const false import package super try …

二叉排序树的增删改查(java版)

文章目录 1. 基本节点2. 二叉排序树2.1 增加节点2.2 查找&#xff08;就是遍历&#xff09;就一起写了吧2.3 广度优先遍历2.4 删除&#xff08;这个有点意思&#xff09;2.5 测试样例 最后的删除&#xff0c;目前我测试的是正确的 1. 基本节点 TreeNode: class TreeNode{pri…

bugku-web-文件包含2

页面源码 <!-- upload.php --><!doctype html><html><head><meta charset"utf-8"/><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

Zabbix_Agent一键安装脚本(包含ansible-playbook批量执行脚本)

为了快速安装配置zabbix_agent&#xff0c;特地写了此shell脚本&#xff0c;脚本实现功能如下&#xff1a; 1、自动检测操作系统类型&#xff0c;目前支持Ubuntu/Centos/Redhat 2、自动获取安装agent主机IP地址 3、交互判断主机IP是否可用&#xff0c;用户输入正确IP地址 4、输…

技术周刊的转变:如何平衡热爱与现实?

大家好&#xff0c;我是那个自己打脸自己的猫哥&#xff0c;本来说周刊不做订阅制的&#xff0c;现在却推出了订阅专栏。今天想为自己辩护一下&#xff0c;同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧&#xff0c;然后再解释为什么会突然出现转变。 出于对…

2024.4.12力扣每日一题——找到冠军 I

2024.4.12 题目来源我的题解方法一 哈希表方法二 列式遍历统计方法三 列式遍历优化统计 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2923 我的题解 方法一 哈希表 哈希表存储不可能是冠军的队伍&#xff0c;最后没在哈希表中的队伍就是冠军。 时间复杂度&#xff1a…

Python学习之-Pandas详解

前言&#xff1a; Pandas 是一个开源的 Python 数据分析库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。Pandas提供 了方便的类表格和类SQL的操作&#xff0c;同时提供了强大的缺失值处理方法&#xff0c;可以方便的进行数据导入、选取、清洗、处理、合并、…

如何进行宏观经济预测

理性预期经济学提出了理性预期的概念&#xff0c;强调政府在制定各种宏观经济政策时&#xff0c;要考虑到各行为主体预期对政策实施有效性的影响&#xff0c;积极促成公众理性预期的形成&#xff0c;从而更好地实现宏观调控的目标。政府统计要深入开展统计分析预测研究&#xf…

poi-tl的使用(通俗易懂,全面,内含动态表格实现 包会!!)

最近在做项目时候有一个关于解析Html文件&#xff0c;然后将解析的数据转化成word的需求&#xff0c;经过调研&#xff0c;使用poi-tl来实现这个需求&#xff0c;自己学习花费了一些时间&#xff0c;现在将这期间的经验总结起来&#xff0c;让大家可以快速入门 poi-tl的介绍 …

979: 输出利用先序遍历创建的二叉树的后序遍历序列

解法&#xff1a; #include<iostream> using namespace std; struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char c) :val(c), left(NULL), right(NULL) {}; }; TreeNode* buildTree() {char c;cin >> c;if (c #) {return NULL;}TreeNode*…

Android图形显示架构概览

图形显示系统作为Android系统核心的子系统&#xff0c;掌握它对于理解Android系统很有帮助&#xff0c;下面从整体上简单介绍图形显示系统的架构&#xff0c;如下图所示。 这个框架只包含了用户空间的图形组件&#xff0c;不涉及底层的显示驱动。框架主要包括以下4个图形组件。…

内网通如何去除广告,内网通免广告生成器

公司使用内网通内部传输确实方便&#xff01;但是会有广告弹窗推送&#xff01;这个很烦恼&#xff01;那么如何去除广告呢&#xff01; 下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1CVVdWexliF3tBaFgN1W9aw?pwdhk7m 提取码&#xff1a;hk7m ID&#xff1a;…

Uniapp小程序路由拦截器、navigator不被拦截

添加一个文件interceptor.js&#xff08;名字随意、位置随意&#xff09; import store from "./store";let config {//白名单页面whiteList: ["/pages/login/login","/pages/guides/guides","/pages/index/index"],//登录页loginPa…

mysql dll文件的缺失和Can‘t connect to MySQL server on ‘localhost‘ (10061)

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

【机器学习】数学基础详解

线性代数&#xff1a;构建数据的骨架 数学对象 标量&#xff08;Scalar&#xff09; 标量是最基本的数学对象&#xff0c;代表了单个的数值&#xff0c;无论是整数还是实数。在机器学习中&#xff0c;标量可以用来表示一个模型的单个参数&#xff0c;如偏差&#xff08;bias&…

如何更好地理解 Vue 3 watch 侦听器的用法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java中Map和Set的用法及介绍

在Java中&#xff0c;Map 和 Set 是两种非常常用的集合类型&#xff0c;它们分别属于Java集合框架的一部分。以下是它们的介绍和用法&#xff1a; Map (映射) Map 是一个存储键值对&#xff08;key-value pairs&#xff09;的集合&#xff0c;它允许你通过键&#xff08;key&…