最长子串和回文子串相关的算法题解

在这里插入图片描述


这里写目录标题

  • 一、3. 无重复字符的最长子串
  • 二、5. 最长回文子串
  • 三、647. 回文子串
  • 四、516. 最长回文子序列

一、3. 无重复字符的最长子串

中等
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

思路:
用滑动窗口的思想做

class Solution:def lengsubstring(self,s):arr=[]res= 0for i in s:while i in arr:arr.pop(0)arr.append(i)res=max(res,len(arr))return res

二、5. 最长回文子串

中等
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

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

示例 2:
输入:s = “cbbd”
输出:“bb”

思路:动态规划
判断所有字串是否为回文字串,选出最长的。
一:状态定义:
db[i][j]表示s[i:j+1]是否为回文子串,(这里+1是为了构造闭区间)
二:状态转移方程
1、当前ij状态
头尾必须相等(s[i]==s[j])==>过去ij状态:去掉头尾之后还是一个回文(dp[i+1][j-1] is True
2、边界条件
a、只要是找过去i、j状态的时候,就会涉及边界条件(即超出边界情况处理):
边界当s[i] == s[j] 且 j-1-(i+1) <=0 ==> 即j-i<=2,一定是回文串
b、当 i==j时,指一个字符,一定是回文串
三、输出内容
db[i][j]为截取的字串,每次发现新回文都比较一下j-i+1,更新起始位置i与最大的长度

class S:def longest(self,s):n=len(s)if n<2:return sdp=[[False] * n for _ in range(n)]max_len=1index=0for i in range(n):dp[i][i]=Truefor j in range(1,n):for i in range(j):if s[i] == s[j]:if j - i <= 2:dp[i][j]=Trueelse:dp[i][j]=dp[i+1][j-1]if dp[i][j] ==True:cur = j - i +1if cur >max_len:max_len=curindex =ireturn s[index:index+max_len]r=S()
s = "babad"
print(r.longest(s))

三、647. 回文子串

中等
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”

示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

思路:动态规划
dp[i][j]:表示区间范围[i,j](注意左闭右闭)的字串是否为回文子串,如果是db[i][j]为True,否则为False
转移逻辑:
当s[i]与s[j]不相等,dp[i][j]一定为False
当s[i]与s[j]相等时,分3中情况
1、下标i与下标j相同,同一个字符a,一定是回文串
2、下标i与下标j相差1,例如aa,一定是回文串
3、下标i与下标j相差大于1,例如cabac,此时s[i]与s[j]相等
需要查看i到j区间是不是回文子串就看aba是不是回文就可以,那么aba的区间就是i+1,j-1区间
这个区间是不是回文串就看dp[i+1][j-1]是否为True

class Solution1:def countSubString(self, s):# 二维数组 i 代表行,j代表列n = len(s)result = 0dp = [[False] * n for _ in range(n)]for i in range(n - 1, -1, -1):for j in range(i, n):if s[i] == s[j]:if j - i <= 1 or dp[i + 1][j - 1]:dp[i][j] = Trueresult += 1return resultr = Solution1()
s = "aaa"
print(r.countSubString(s))

四、516. 最长回文子序列

中等
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。

示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。

思路:动态规划
dp[i][j]从i到j位置的子序列的最大回文长度
dp[i][j]=1
if s[i]==s[j],dp[i][j]=dp[i+1][j-1]+2
else dp[i][j]=max(dp[i+1][j],dp[i][j-1])
dp[i][j]和他左下角,坐标、下面,三个dp值相关,所以行循环i需要逆序,列需要顺序

class Solution2:def longest(self,s):n=len(s)dp=[[0]*n for _ in range(n)]for i in range(n-1,-1,-1):dp[i][i]= 1for j in range(i+1,n):if s[i]==s[j]:dp[i][j]=dp[i+1][j-1]+2else:dp[i][j]=max(dp[i+1][j],dp[i][j-1])return dp[0][n-1]res=Solution2()
s = "bbbab"
print(res.longest(s))

在这里插入图片描述

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

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

相关文章

手把手教你Linux系统下的Java环境配置,简单到不行!

推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;一&#xff09; 给软件行业带来了春天——揭秘Spring究竟是何方神圣&#xff08;二&#xff09; 文章目录 推荐阅读下载JDK安装包方式一方式二 添加环境变量验证安装情况 下载JDK安装包 方式一 1.进入…

第三百五十二回

文章目录 1. 概念介绍2. 获取方法3. 示例代码4. 对比与总结4.1 横向对比4.2 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取当前时区.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们使用的…

第三百五十三回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

【PX4-AutoPilot教程-源码】移植PX4固件到自制NuttX操作系统飞控板的方法

移植PX4固件到自制NuttX操作系统飞控板的方法 找到使用相同&#xff08;或型号相似&#xff09;CPU类型的现有目标并进行复制飞控板的配置文件夹结构firmware.prototype文件default.px4board文件bootloader.px4board文件nuttx-config/bootloader/defconfig文件nuttx-config/nsh…

阿莱(ARRI)MOV变0字节恢复案例

阿莱(ARRI)是专业级的影视产品软硬件供应商&#xff0c;很多大片都是使用ARRI的设备拍摄出来的。之前我们处理过阿莱的MXF和MOV等文件&#xff0c;今天要说的案例是ARRI的MOV&#xff0c;还是之前熟悉的EXFAT文件系统然后长度突然变0字节的问题。 故障存储:16T/MS Exfat文件系…

如何在Linux系统中配置并优化硬盘的RAID

在Linux系统中配置和优化硬盘的RAID技术可以帮助提高数据存储性能和安全性。RAID&#xff08;Redundant Array of Independent Disks&#xff09;技术通过将多个硬盘组合起来&#xff0c;以增加性能、容量或冗余度&#xff0c;提高数据的可靠性和可用性。本文将介绍如何在Linux…

Days 34 ElfBoard 音频接口

音频接口介绍 音频模块采用了 NAU88C22 芯片&#xff0c;芯片数据信号使用 I2S 接口进行通讯&#xff0c;主要信号功能&#xff1a; SAI_MCLK&#xff1a;音频信号主时钟&#xff1b; SAI_BCLK&#xff1a;音频信号位时钟&#xff1b; SAI_SYNC&#xff1a;左右声道控制信号&am…

综合练习

目录 查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、工资等级 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、部门名称、工资…

用Boule绘制地球重力场

文章目录 参考椭球标准重力重力地图 参考椭球 boule中定义了多种参考椭球&#xff0c;可用于表示地球、火星等星体的重力分布。可通过pip安装 pip install boule安装完成后可直接调用 import boule as blboule中已经定义的椭球如下 椭球星体GRS80地球WGS84地球MARS火星MERC…

linux内核模块module_put()函数详解--03

对应module_put()函数详细用法分享。 第一&#xff1a;函数简介 //函数原型 void module_put(struct module * module) //函数功能 该函数功能是将一个特定模块module的引用计数减一 这样当一个模块的引用计数不为0而不能被内核卸载的 时候&#xff0c;可以调用该函数一次或多…

【嵌入式学习】IO网络接口day02.18

1.使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./test1.txt","r"))NULL){perror("错误信息");return -1…

springboot197基于springboot的毕业设计系统的开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的毕业设计系统的开发 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …