5 最长回文子串(区间 dp)

2023-10-30

1. 问题描述:

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

示例 1:

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

示例 2:

输入:s = "cbbd"
输出:"bb" 

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring/

2. 思路分析:

这道题目类似于最长回文子序列的问题,而子串的限制要求字符串是连续的,但是也是类似的思路,因为同样是求解一个区间中满足某个限制的问题,所以可以使用区间 dp 来解决,只是在状态计算的时候会有些不一样,只需要细微调整一下即可,对于长度为 1 的子串那么回文串的长度为  1;对于长度为 2 的子串判断 s[i] == s[j],相等则为 2;长度大于 2 的子串判断 s[i] == s[j] 并且 f(i + 1,j - 1) 大于 0 说明 s[i + 1:j - 1] 才是回文串。

3. 代码如下:

python(超时):

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        f = [[0] * (n + 10) for i in range(n + 10)]
        res = ""
        # 经典的区间dp框架, 枚举长度
        for l in range(1, n + 1):
            # 枚举起点i
            i = 0
            while i + l - 1 < n:
                # j为当前起点为i长度为l的区间终点
                j = i + l - 1
                if l == 1:
                    f[i][j] = 1
                elif l == 2:
                    if s[i] == s[j]:
                        f[i][j] = 2
                else:
                    if s[i] == s[j] and f[i + 1][j - 1]:
                        f[i][j] = f[i + 1][j - 1] + 2
                if f[i][j] > len(res):
                    res = s[i: j + 1]
                i += 1
        return res

go:

package main

import "fmt"

func longestPalindrome(s string) string {
	n := len(s)
	f := make([][]int, n+10)
	for i := 0; i < n+10; i++ {
		f[i] = make([]int, n+10)
	}
	res := ""
	for l := 1; l <= n; l++ {
		i := 0
		for ; i+l-1 < n; i++ {
			j := i + l - 1
			if l == 1 {
				f[i][j] = 1
			} else if l == 2 {
				if s[i] == s[j] {
					f[i][j] = 2
				}
			} else if s[i] == s[j] && f[i+1][j-1] > 0 {
				f[i][j] = f[i+1][j-1] + 2
			}
			if f[i][j] > len(res) {
				res = s[i : j+1]
			}
		}
	}
	return res
}

中心扩展解法:

python:

class Solution:
    def get(self, i: int, j: int, s: str, res: str):
        t = ""
        while i >= 0 and j < len(s) and s[i] == s[j]:
            t = s[i: j + 1]
            i -= 1
            j += 1
        if len(t) > len(res):
            res = t
        return res

    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        res = ""
        for i in range(n):
            res = self.get(i, i, s, res)
            res = self.get(i, i + 1, s, res)
        return res

go:

package main

import "fmt"

func get(i int, j int, s string, res string) string {
	t := ""
	for i >= 0 && j < len(s) && s[i] == s[j] {
		t = s[i : j+1]
		i -= 1
		j += 1
	}
	if len(t) > len(res) {
		res = t
	}
	return res
}

func longestPalindrome(s string) string {
	n := len(s)
	res := ""
	for i := 0; i < n; i++ {
        // 若当前的回文串为奇数
		res = get(i, i, s, res)
        // 若当前的回文串为偶数
		res = get(i, i+1, s, res)
	}
	return res
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5 最长回文子串(区间 dp) 的相关文章

随机推荐

  • RS-485通信协议(ModBus版)

    从机 设备 的通信参数 波特率 2400 115200bps 出厂默认9600bps 数据位 7 9位 出厂默认8位 停止位 1 2位 出厂默认1位 奇偶校验 无校验 奇校验 偶校验 RS485 ModBus通信格式 主机向485总线发送问
  • spring boot整合shiro引用配置文件配置是出现的问题

    Spring boot 整合shiro 使用yml配置文件 最近自己玩一下springBoot配置 然后整合一下常用的框架 遇到一个问题 配置LifecycleBeanPostProcessorBean 的时候总是先于spring 读取ym
  • 力扣724.寻找数组的中心索引——python

    题目要求中心索引左右之和相等 没有的话我们返回 1 重复的返回最左边的 我们可以直接遍历所有 分别进行求和 满足条件我们返回值 否则 1 for i in range len nums if sum nums i sum nums i 1
  • Scanner类中next()与nextLine()的区别

    Scanner类 Scanner是Java5的新特性 我们可以通过Scanner类来从键盘获取用户输入的内容 下面是创建Scanner对象的语法 创建之前需要导入Scanner的包 import java util Scanner Scan
  • 文字的背景划过效果

    文章中的效果模仿的是 CodePen 网站中的效果 传送门 原理 给 h1 的前面添加一个 伪元素 设置他的收缩比例为 0 收缩中心在 右下角 right bottom 在鼠标移上时 设置 收缩中心在 左下角 left bottom 并设置
  • S8-codelab02

    import news cnn model import numpy as np import os import pandas as pd import pickle import shutil import tensorflow as
  • 如何将ajax传过来的数据转为,spring 接收前台ajax传来的参数的几个方法

    知识补充 JSON stringify 将value Object Array String Number 序列化为JSON字符串 JSON parse 将JSON数据解析为js原生值 toJSON 作为JSON stringify中第二个
  • java/php/net/python美容美发店会员管理系统

    本系统带文档lw万字以上 文末可领取本课题的JAVA源码参考 开发环境 开发语言 Java 框架 ssm 技术 JSP JDK版本 JDK1 8 服务器 tomcat7 数据库 mysql 5 7 一定要5 7版本 数据库工具 Navica
  • 【中大加机试之最后的挣扎之“循环移位”】

    题目描述 给出字符串A和B 判断A是否是B的进行循环移位得到的子串 如A ABC B BCDEFA 则是 输入输出格式 输入描述 多组输入 输入两个字符串A和B 输出描述 如果是循环移位子串输出yes 否则输出no 如 ABC BCDEFA
  • spyder python调试查看类信息_Python调试工具-Spyder

    OS Windows 7 关键字 Python IDE Spyder 1 安装工具pip https pip pypa io en latest installing html 运行cmd python get pip py 注 Pytho
  • 软件测试习题附答案

    转载 https blog csdn net qq 23994787 article details 73699212 单项选择题 共20小题 每小题1 分 满分20分 请将答案填入题后括号中 1 在软件生命周期的哪一个阶段 软件缺陷修复费
  • 对某个字段相同的值根据另一个字段排序(Oracle数据库)

    对某个字段相同的值根据另一个字段排序 Oracle数据库 SELECT a id a material code RANK OVER PARTITION BY a material code ORDER BY a id DESC RK FR
  • 华硕电脑光驱位换成固态硬盘

    因为要拆机 不太敢自己动手 找了专业的电脑维修人员给我换的 记录一下换的过程 一共20分钟 看起来也不是很难的样子 把光驱叉掉换成240G的固态硬盘 下次要学会自己换 科普一下 笔记本拆掉光驱换固态硬盘就必须要购买一个重要配件 叫光驱位硬盘
  • ARP协议工作原理

    ARP协议工作原理 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表 以表示 IP 地址和 MAC 地址之间的对应关系 主机 网络接口 新加入网络时 也可能只是mac地址发生变化 接口重启等 会发送免费ARP报文把自己IP地址与
  • k8s学习笔记二(资源清单和控制)

    资源清单 资源类型 名称空间级别 工作负载型资源 workload Pod Replica Set Deployment Stateful Set Daemon Set Job CronJob Replication Controller在
  • Maven工程打jar包的N种方式

    Maven工程打jar包 一 IDEA自带打包插件 二 maven插件打包 2 1 制作瘦包 直接打包 不打包依赖包 2 2 制作瘦包和依赖包 相互分离 2 3 制作胖包 项目依赖包和项目打为一个包 2 4 制作胖包 transform部分
  • 分离圆环图显示百分比_简单介绍一下Excel中的圆环图

    圆环图也是Excel中的一个比较重要的图表 是以圆环形状来表示数据之间占比 下面就来简要介绍一下圆环图的使用 1 选中目标区域 或者选中目标数据区域中的其中一个单元格 2 点击 插入 选项卡 然后点击 插入饼图或圆环图 命令 3 在下拉列表
  • Python绘图系统14:用tkinter做一个绘图风格控件

    文章目录 绘图风格 线型和点型 其他参数 源代码 Python绘图系统 从0开始的3D绘图系统 一个3D坐标系 多个函数 自定义控件 极坐标绘图 绘图风格 风格控件 图表类型和风格 散点图和条形图 混合类型图表 多子图 绘图风格 以plot
  • 10出租车计费

    程序员小明打了一辆出租车去上班 出于职业敏感 他注意到这辆出租车的计费表有点问题 总是偏大 出租车司机解释说他不喜欢数字4 所以改装了计费表 任何数字位置遇到数字4就直接跳过 其余功能都正常 比如 23再多一块钱就变为25 39再多一块钱变
  • 5 最长回文子串(区间 dp)

    1 问题描述 给你一个字符串 s 找到 s 中最长的回文子串 示例 1 输入 s babad 输出 bab 解释 aba 同样是符合题意的答案 示例 2 输入 s cbbd 输出 bb 提示 1 lt s length lt 1000 s