leetcode 5 最长回文子串

2023-10-27

题目

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

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

示例

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

解析

这道题和之前的那道回文的很像:647回文子串,求个数,解法还是动态规划,用动规五部曲分析下:
1、确定DP数组及其含义
这道题的定义方法之前遇到过:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。(是一个true还是false的定义,由于题目是求最长回文串,所以这个dp肯定不能用来当最后的结果)

2、确定递推公式
当s[i] != s[j] 时,那什么都不用说了,肯定是false;
当s[i] == s[j] 时,这就得分情况看下(和之前那道题的分情况套路一样):

  • 若i == j,那就意味是是同一个值,如"a",那没问题,是回文;
  • 若j - i = 1,那意味着是挨着的两个,如"aa",这样的也是回文,注意是j-i,j比i大;
  • 其余的情况,就需要看前一时刻的递推公式怎么样,即dp[i+1][j-1](注意是谁加谁减)

3、 初始化
二维布尔型dp数组的话,默认初始化是false,但要注意其实dp[i][i]这种的一定是true,可以在初始化的时候赋值好

4、遍历顺序
字符串类型的动规遍历顺序都一样,从左下角到右上角

func longestPalindrome(s string) string {
    n := len(s)
    maxLen := 0
    left := 0
    dp := make([][]bool, n+1)
    for i := 0; i <= n; i++ {
        dp[i] = make([]bool, n+1)
        dp[i][i] = true
    }

    for i := n-1; i >= 0; i-- {
        for j := i+1; j <= n-1; j++ { // 这里是因为上面初始化的时候已经判过了(j:=i也对)
            if s[i] == s[j] {
                if j-i <= 1 || dp[i+1][j-1] == true { // 谁加谁减要分清
                    dp[i][j] = true
                }
            }
            if dp[i][j] == true && j - i > maxLen {
                maxLen = j - i
                left = i
            }
        }
    }
    return s[left: left+maxLen+1]
}

另一种方法是中心扩展法(也不太好理解,还是用动态规划吧)

func longestPalindrome(s string) string {
    n := len(s)
    start, end := 0, 0
    for i := 0; i < n; i++ {
        left1, right1 := expend(s, i, i, n)
        left2, right2 := expend(s, i, i+1, n)
        if right1 - left1 > end - start{
            start, end = left1, right1
        }
        if right2 - left2 > end - start{
            start, end = left2, right2
        }
    }
    return s[start:end+1]
}

func expend(s string, i, j, n int) (int, int) {
    for i >= 0 && j < n && s[i] == s[j] {
        i-- //中心扩展
        j++
    }
    return i+1, j-1
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 5 最长回文子串 的相关文章

随机推荐

  • python和opencv利用摄像头进行视频捕获

    python容易上手 利用opencv进行视频录制及后期的人脸识别 都是比较简单易上手的方案 工具 python3 10 opencv4 54 平台 win10 vscode 摄像头捕获程序 import cv2 as cv cap cv
  • Arduino从零开始(2)——控制舵机与步进电机

    0 前言 本文主要介绍通过Arduino控制舵机 步进电机以及循环的使用 目录 0 前言 1 介绍 2 Arduino控制舵机 2 1方法一 2 2方法二 3 Arduino控制步进电机 1 介绍 对于Arduino控制舵机的方法是通过其输
  • 做方差分析需要正态性检验吗_方差分析(SPSS版)

    方差分析 SPSS版 原创 Gently spss学习乐园 2019 10 15 文章同步于 微信公众号 SPSS学习乐园 方差分析 SPSS版 方差分析的基本思想 R A Fisher提出的统计理论基础 将总变异分解为由研究因素所产生的变
  • 计算机系统结构:流水线技术总结

    文章目录 什么是流水线 流水线的分类 流水线的性能指标 流水线设计中的若干问题 非线性流水线的调度 单功能非线性流水线的最优调度 多功能非线性流水线的调度 一条经典的5段流水线 相关与流水线冲突 结构冲突 因硬件资源满足不了指令重叠执行的要
  • 基于Pytorch实现LSTM(多层LSTM,双向LSTM)进行文本分类

    LSTM原理请看这 点击进入 LSTM nn LSTM input size hidden size num layers 1 nonlinearity tanh bias True batch first False dropout 0
  • Cesium加载Supermap的wmts服务

    最近使用cesium 加载supermap的wmts 服务 多次遇到加载异常与白页面问题 纠结好久最后才搞定 特此记录 1 首先找到方法加载wmts 的api 文档 官方提示使用WebMapTileServiceImageryProvide
  • nginx配置防止域名恶意解析

    前几发生一件事情 就是通过nginx日志发现有一个域名恶意指向到了我的服务器 大家可以去查查域名恶意解析可能会造成的危害 由于我是用的nginx配置了一个反向代理 所以直接配置nginx就可以实现域名恶意解析的问题了 首先打开我们的ngin
  • Hyperledger Fabric 入门笔记(四)Fabric V2.4 测试网络基础

    文章目录 前言 一 准备测试网络 1 1 概述 1 2 完成准备工作 1 2 1 运行install fabric sh脚本 1 2 2 文件夹去锁 可选 1 3 install fabric sh脚本运行结果 1 4 什么是二进制文件 1
  • 计算机毕业设计题目100例

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • iOS学习之iOS沙盒(sandbox)机制和文件操作(一)

    1 iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件 不可以去其它地方访问 此区域被成为沙盒 所以所有的非代码文件都要保存在此 例如图像 图标 声音 映像 属性列表 文本文件等 1 1 每个应用程序都有自己的存储空间
  • 移动硬盘安装centos8

    买了个西数固态移动硬盘想要安装centos8 感觉应该很简单没想到也有不少坑 1 下载iso https www centos org download X86 64版本的 CentOS 8 4 2105 x86 64 dvd1 iso 为
  • Java包名与包路径

    很多初学者以为只要把生成的class文件放在某个目录下 这个目录名就成了这个类的包名 这是一个错误的看法 不是有了目录 结构 就等于有了包名 为Java类添加包必须在Java源文件中通过 package语句指定 单靠目录名是没法指定的 Ja
  • Hive对库对表的操作

    目录 前期工作 1 Hive对库的操作 2 Hive对表的操作 3 Hive的分区表 前期工作 需提前启动服务端 hiveserver2 和客户端 beeline u jdbc hive2 192 168 67 110 10000 n ro
  • 如何判断一个请求是否为Ajax请求

    Ajax请求中主要对象 原生对象 是XMLHttpRequest 知道了该对象 那么就可以通过判断请求头属性来鉴别当前请求 判断当前请求是否为Ajax public static boolean isAjaxRequest HttpServ
  • typora文章同步(跨平台)

    typora实现备份 个人博客 一 图片上传 PicGo有提供默认的图床 可以直接使用 但是有上传的限制 有特定要求的可以自己配置github图床 1 配置github图床 利用github搭建图床 2 安装PicGo 下载链接 windo
  • 【判断题】【简答题】【数据库原理】

    文章目录 一 判断题 二 简答题 一 判断题 1 数据的安全性主要防范的对象是合法用户 正确答案 错 2 数据库恢复是利用冗余数据来重建数据库 正确答案 对 3 定义外键级级联是为了保证相关表之间数据的一致性 正确答案 对 4 创建唯一性索
  • React小技巧-React.memo useMemo useCallback

    React小技巧 React memo useMemo useCallback 原文 https piyushsinha tech series optimizing react ck subscriber id 1555690090 本文
  • TV服务器的安装维护和调试,广电机顶盒安装调试教程及系统设置密码

    QQ截图20160813140648 png 931 06 KB 下载次数 3 2016 8 13 14 43 上传 电视机与机顶盒正确连接后 打开电视机和机顶盒的电源开关 并按电视机遥控器的视频切换键 TV 切换到IPTV界面 第一步 进
  • Python可视化界面编程入门

    Python可视化界面编程入门具体实现代码如所示 1 普通可视化界面编程代码入门 import sys from PyQt5 QtWidgets import QWidget QApplication 导入两个类来进行程序界面编程 if n
  • leetcode 5 最长回文子串

    题目 给你一个字符串 s 找到 s 中最长的回文子串 如果字符串的反序与原始字符串相同 则该字符串称为回文字符串 示例 输入 s babad 输出 bab 解释 aba 同样是符合题意的答案 解析 这道题和之前的那道回文的很像 647回文子