LeetCode_5_中等_最长回文子串

文章目录

  • 1. 题目
  • 2. 思路及代码实现(Python)
    • 2.1 动态规划
    • 2.2 中心扩展算法


1. 题目

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

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

示例 1:

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

示例 2:

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


提示

  • 1 < = s . l e n g t h < = 1000 1 <= s.length <= 1000 1<=s.length<=1000
  • 仅由数字和英文字母组成

2. 思路及代码实现(Python)

2.1 动态规划

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 a(xxxx)a,如果我们已经知道中间部分的字符 (xxxx) 是回文串,那么 a(xxxx)a 一定是回文串,这是因为它的首尾两个字母都是 a。根据这样的思路,我们就可以用动态规划的方法解决本题。我们用 P ( i , j ) P(i,j) P(i,j) 表示字符串 s 的第 ij 个字母组成的串是否为回文串,可以得到状态转移 P ( i , j ) = P ( i + 1 , j − 1 ) ∧ ( S i = = S j ) P(i,j)=P(i+1, j-1)\land(S_i==S_j) P(i,j)=P(i+1,j1)(Si==Sj),循环终止的边界条件是 i > j i>j i>j 或者 S i ≠ S j S_i\neq S_j Si=Sj,这里 i = = j i==j i==j 时显然是个最短的回文串,此时可以得到 P ( i , i ) = T r u e , P ( i , i + 1 ) = = ( S i − S i + 1 ) P(i,i)=True, P(i,i+1)==(S_i-S_{i+1}) P(i,i)=True,P(i,i+1)==(SiSi+1),此时,若回文串扩展的两边字符不相等,则可以跳出这个回文串的扩展,可以得到当前子串的长度 j − i + 1 j-i+1 ji+1

动态规划的方法需要存储一张 n × n n\times n n×n 的表,通过存储之前计算过的值(状态),来节省后续计算的时间。单次循环的复杂度为 O ( 1 ) O(1) O(1),状态转移总次数 O ( n 2 ) O(n^2) O(n2),因此时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度也为 O ( n 2 ) O(n^2) O(n2)

class Solution:def longestPalindrome(self, s: str) -> str:n = len(s)if n < 2:return smax_len = 1begin = 0# dp[i][j] 表示 s[i..j] 是否是回文串dp = [[False] * n for _ in range(n)]for i in range(n):dp[i][i] = True# 递推开始,先枚举子串长度for L in range(2, n + 1):# 枚举左边界,左边界的上限设置可以宽松一些for i in range(n):# 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得j = L + i - 1# 如果右边界越界,就可以退出当前循环if j >= n:breakif s[i] != s[j]:dp[i][j] = False else:if j - i < 3:dp[i][j] = Trueelse:dp[i][j] = dp[i + 1][j - 1]# 只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置if dp[i][j] and j - i + 1 > max_len:max_len = j - i + 1begin = ireturn s[begin:begin + max_len]

执行用时:3024 ms
消耗内存:24.70 MB

参考来源:力扣官方题解

2.2 中心扩展算法

上述方法遍历了所有的长度,以及所有的左起始节点。但其实根据上述的状态转移公式可知,当一个子串为回文子串时,其内部子串也同样是回文子串,因此我们不必搜索所有的子串情况,而是可以只总最短的回文子串为中心进行扩展搜索,当扩展的两边字符不相等时,则停止搜索,依次遍历所有的最短子串中心。

显然,最短子串中心就是每个单独的字符串。这里的时间复杂度为 O ( n 2 ) O(n^2) O(n2),遍历了长度为 1,2 的回文中心,并且每个中心向外最多扩展 n / / 2 n//2 n//2 次,而空间复杂度为 O ( 1 ) O(1) O(1),仅保存了最短回文中心和扩展的长度。

class Solution:def expandAroundCenter(self, s, left, right):while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1right += 1return left + 1, right - 1def longestPalindrome(self, s: str) -> str:start, end = 0, 0for i in range(len(s)):left1, right1 = self.expandAroundCenter(s, i, i)left2, right2 = self.expandAroundCenter(s, i, i + 1)if right1 - left1 > end - start:start, end = left1, right1if right2 - left2 > end - start:start, end = left2, right2return s[start: end + 1]

执行用时:300 ms
消耗内存:16.98 MB

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

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

相关文章

随机过程——卡尔曼滤波学习笔记

一、均方预测和随机序列分解 考虑随机序列 使用预测 定义 称为的均方可预测部分。 若相互独立&#xff0c;则是均方不可预测的。 定义随机序列的新息序列 V(k)基于样本观测的条件均值为0&#xff0c;即均方不可预测。 V(k)与是正交的&#xff0c;即。 二、卡尔曼滤波 …

目标检测脚本之mmpose json转yolo txt格式

目标检测脚本之mmpose json转yolo txt格式 一、需求分析 在使用yolopose及yolov8-pose 网络进行人体姿态检测任务时&#xff0c;有时需要标注一些特定场景的中的人型目标数据&#xff0c;用来扩充训练集&#xff0c;提升自己训练模型的效果。因为单纯的人工标注耗时费力&…

No Feign Client for loadBalancing defined. 错误解决

1、原因 在使用Spring Cloud Feign进行服务调用时&#xff0c;如果想要利用Ribbon或Spring Cloud LoadBalancer实现客户端负载均衡&#xff0c;需要确保项目中已经引入了对应的依赖。 从Spring Cloud 2020.0及以上版本开始&#xff0c;Ribbon已被弃用&#xff0c;并推荐使用…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例3-4 CSS 立方体

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>CSS 立方体</title> <link href"CSS/style.css" rel"stylesheet" type"text/css"> <style> .box {width: 200px…

BigDecimal去掉小数位无效0并转换为String

BigDecimal去掉小数位无效0并转换为String //去掉小数位无效0并转换为Stringpublic static String takeOutZero(BigDecimal data) {int point String.valueOf(data).indexOf(".");if(point > 0){String[] split String.valueOf(data).split("");int a…

Spring上下文之support模块MessageSourceAccessor

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

「JavaSE」类和对象1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 类和对象 &#x1f349;类的定义&#x1f34c;类的实例化 &#x1f349;this引用&#x1f349;对象的构造及初始化&#x1f34c;…

【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 懒汉式&#xff08;Lazy Initialization&#xff09;&#xff1a; 双重检查锁定&#xff08;Double-Checked Locking&#xff09;…

C 练习实例26

题目&#xff1a;利用递归方法求5!。 程序分析&#xff1a; 使用递归要找到函数 f(n)与f(n-1)的关系&#xff0c;以及结束条件 此处的函数关系为&#xff1a;f(n) n*f(n-1)&#xff0c;f(n)为n的阶层 代码&#xff1a; #include <stdio.h> long double f(int n) {i…

MySQL篇—自带物理克隆数据工具Clone插件介绍(第一篇,总共三篇)

各位小伙伴&#xff0c;今天我为大家介绍一下MySQL Clone Plugin这个插件&#xff0c;简单来说&#xff0c;就是MySQL 8.0.17版本之后的一个物理克隆数据工具&#xff0c;它能够帮助我们快速、高效地克隆或复制数据库&#xff0c;极大地简化了数据库迁移、备份和恢复的过程&…

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤&#xff1a; 开立证券账户&#xff1a;首先需要选择一家证券公司&#xff0c;向其提交相关材料开立证券账户&#xff0c;并完成账户开立手续。 研究和选择股票&#xff1a;在决定购买股票之前&#xff0c;建…

GPCR蛋白一般残基编号(Generic residue numbering)

文章目录 前言定义特殊情况参考连接 前言 在相应的文章中看到对于对于描述GPCR中的序列位置&#xff0c;往往在除了在当前蛋白的氨基酸序列序号意外&#xff0c;会在右上角标注一个类似于6 x 49的编号。经查这个编号有一个统一名称&#xff1a;Generic residue numbering。本文…

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

Kamailio使用自定义DNS条目

绕过DNS服务器&#xff0c;使用自定义DNS条目&#xff0c;有多种办法&#xff0c;这里仅提供其中一种&#xff1a; modparam("corex", "dns_cache", "typeA;namekamailio.org;addr192.168.1.100;ttl3600000;flags2") # 可以定义多次 其中&#x…

UIControl 功能和用法

UIControl 功能和用法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们深入探讨iOS开发中常用的UI控件之一——“UIControl”&#xff0c;并详…

Springboot 中接口服务重试机制

在平时开发中可能在调用服务时会遇到调用失败的情况&#xff0c;在springboot 中retery 机制可以很好的满足我们的开发场景&#xff0c;下面举个简单的例子模拟第三方调用。 package com.szhome.web.action;import com.szhome.web.service.ThirdApiService; import org.spring…

Vue+element-china-area-data实现省市区三级联动

安装依赖 npm install element-china-area-data -S cnpm install element-china-area-data -S 引用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from element-china-area-data&#xff1b; provinceAnd…

Linux 命令解释程序(shell)的模拟实现

1.实验内容 分析、设计与实现基于 Linux 内核的命令解释程序&#xff08;Shell&#xff09;&#xff0c;主要包括系统环境变量的设置和初始化、系统命令提示符显示、命令辨别解析&#xff08;区分内部命令与外部命令及不同内部命令&#xff09;、典型内部命令&#xff08;譬如…

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…