当前位置: 首页 > news >正文

最长回文子串



问题

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

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

示例 1:

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

示例 2:

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

提示:

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

题解

方法1:动态规划

对于一个子串而言,如果它是回文串,并且长度大于 222,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是“a”。

那么我们就可以写出动态规划的状态转移方程:

if len(s)<=2

else

中心扩展算法
  • 确定中心回文子:P(i,j)中心子串是指长度大于等于1的相同字符组成的子串,例如“bab”的“a”,“baab”的“aa”,“baaab”的“aaa”等
  • 从每一种边界情况开始「扩展」,也可以得出所有的状态对应的答案。

class Solution:def longestPalindrome(self, s: str) -> str:max_longest=0max_longest_s=""s_len=len(s)longest=[[0]*s_len for _ in range(s_len)]for i in range(s_len):longest[i][i] = 1left_i,right_i=i-1,i+1while right_i<s_len and s[i]==s[right_i]:longest[i][right_i]=1right_i+=1while left_i>=0 and right_i<s_len:if s[left_i]==s[right_i]:longest[i][right_i] = 1longest[i][left_i] = 1left_i-=1right_i+=1else:breakif right_i-1-left_i-1+1>max_longest:max_longest_s=s[left_i+1:right_i]max_longest=right_i-1-left_i-1+1# print(longest,max_longest_s)return max_longest_s

方法2 Manacher算法

请自学

http://www.lryc.cn/news/215946.html

相关文章:

  • 从瀑布模式到水母模式:ChatGPT引领软件研发的革新之路
  • 一种使用wireshark快速分析抓包文件amr音频流的思路方法
  • 银河麒麟x86版、银河麒麟arm版操作系统编译zlmediakit
  • InnoDB - 双写机制
  • 【蓝桥杯选拔赛真题08】C++最大值最小值平均值 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析
  • 软考高级系统架构设计师系列之:系统开发基础知识、项目管理、信息安全和网络安全、计算机网络章节选择题详解
  • 0基础学习PyFlink——时间滑动窗口(Sliding Time Windows)
  • API安全之《大话:API的前世今生》
  • H5或者Vue实现二维码识别
  • stm32整理(三)ADC
  • Redis-持久化+主从架构
  • STM32H750之FreeRTOS学习--------(四)中断管理
  • Macroscope安全漏洞检测工具简介
  • 【Linux】Nignx的入门使用负载均衡动静分离(前后端项目部署)---超详细
  • 【入门Flink】- 04Flink部署模式和运行模式【偏概念】
  • react面试要点
  • 在Google Kubernetes集群创建分布式Jenkins(一)
  • 【Python全栈_公开课学习记录】
  • uniapp循环列表单选框实现单选
  • 【强化学习】14 —— A3C(Asynchronous Advantage Actor Critic)
  • Google单元测试sample分析(四)
  • 网络套接字编程(二)
  • LLaMA-Adapter源码解析
  • JavaScript设计模式之发布-订阅模式
  • mysql---索引
  • 微信小程序——简易复制文本
  • 【51单片机】矩阵键盘与定时器(学习笔记)
  • vue 中使用async await
  • C语言学习之内存区域的划分
  • Unity Animator cpu性能测试