【力扣算法08】之 5. 最长回文子串 python

news2024/10/7 20:25:53

文章目录

  • 问题描述
    • 示例1
    • 示例2
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
    • 详细分析
  • 运行效果截图
    • 调用示例
    • 运行结果
  • 完结

问题描述

在这里插入图片描述

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

在这里插入图片描述

示例1

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

示例2

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

提示

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

思路分析

在这里插入图片描述

我们可以使用动态规划来解决这个问题。首先,定义一个二维数组 dp,其中 dp[i][j] 表示从索引 i 到索引 j 的子串是否是回文串。如果子串是回文串,则 dp[i][j] 的值为 True,否则为 False

根据回文串的定义,我们可以得到以下推导公式:

  • 如果一个字符串的首尾字符不相等,则它肯定不是回文串,即:dp[i][j] = False
  • 如果一个字符串的首尾字符相等,并且去掉首尾字符后的子串是回文串,则它也是回文串,即:dp[i][j] = dp[i+1][j-1]

接下来,我们需要考虑边界条件。当子串的长度为 12 时,只需要判断首尾字符是否相等即可。因此,有以下边界条件:

  • j - i + 1 = 1,即子串长度为 1 时,表示该字符本身就是回文串,即:dp[i][j] = True
  • j - i + 1 = 2,即子串长度为 2 时,如果首尾字符相等,则该子串也是回文串,即:dp[i][j] = (s[i] == s[j])

最后,我们遍历字符串 s,根据以上推导公式计算 dp 数组的值,并记录最长的回文子串。

代码分析

在这里插入图片描述

  1. 首先,判断输入字符串 s 的长度是否为 0,如果是,则直接返回空字符串。
  2. 接着,初始化变量 n,表示字符串 s 的长度,并创建一个二维数组 dp,大小为 n × n,用于存储回文子串的判断结果。
  3. 然后,初始化变量 startmax_len,表示最长回文子串的起始位置和长度,初始值均为 0。
  4. 对于单个字符来说,它本身就是回文串,所以将 dp[i][i] 设置为 True
  5. 接下来,通过两层循环遍历字符串 s,其中,外层循环变量 j 表示右边界,内层循环变量 i 表示左边界。
  6. 在循环过程中,对于每个子串的首尾字符进行判断:
    • 如果首尾字符不相等,即 s[i] != s[j],则该子串不是回文串,将 dp[i][j] 设置为 False
    • 如果首尾字符相等,即 s[i] == s[j],则判断去掉首尾字符后的子串是否是回文串,即 dp[i+1][j-1],如果是,则当前子串也是回文串,将 dp[i][j] 设置为 True
    • 同时,更新最长回文子串的起始位置和长度,并记录下来。
  7. 循环结束后,返回字符串 s 中最长回文子串,即 s[start:start + max_len]

完整代码

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        n = len(s)
        if n == 0:
            return ""

        # 初始化dp数组
        dp = [[False] * n for _ in range(n)]  # 创建一个大小为n×n的二维数组dp,用于存储回文子串的判断结果

        # 初始化最长回文子串的起始位置和长度
        start = 0
        max_len = 1

        # 单个字符一定是回文串,将dp[i][i]设置为True
        for i in range(n):
            dp[i][i] = True

        # 遍历字符串,计算dp数组的值
        for j in range(1, n):  # 外层循环变量j表示右边界
            for i in range(j):  # 内层循环变量i表示左边界
                if s[i] == s[j]:
                    # 当前字符首尾相等,如果去掉首尾字符后的子串也是回文串,则当前子串也是回文串
                    if j - i + 1 <= 2 or dp[i + 1][j - 1]:
                        dp[i][j] = True
                        # 更新最长回文子串的起始位置和长度
                        if j - i + 1 > max_len:
                            max_len = j - i + 1
                            start = i

        return s[start:start + max_len]  # 返回最长回文子串

详细分析

  1. 首先,判断输入字符串 s 的长度是否为 0,如果是,则直接返回空字符串。
n = len(s)
if n == 0:
    return ""
  1. 接着,初始化变量 n,表示字符串 s 的长度,并创建一个二维数组 dp,大小为 n × n,用于存储回文子串的判断结果。
n = len(s)
dp = [[False] * n for _ in range(n)]
  1. 然后,初始化变量 startmax_len,表示最长回文子串的起始位置和长度,初始值均为 0。
start = 0
max_len = 1
  1. 对于单个字符来说,它本身就是回文串,所以将 dp[i][i] 设置为 True
for i in range(n):
    dp[i][i] = True
  1. 接下来,通过两层循环遍历字符串 s,其中,外层循环变量 j 表示右边界,内层循环变量 i 表示左边界。
for j in range(1, n):
    for i in range(j):
  1. 在循环过程中,对于每个子串的首尾字符进行判断:
    • 如果首尾字符不相等,即 s[i] != s[j],则该子串不是回文串,将 dp[i][j] 设置为 False
    • 如果首尾字符相等,即 s[i] == s[j],则判断去掉首尾字符后的子串是否是回文串,即 dp[i+1][j-1],如果是,则当前子串也是回文串,将 dp[i][j] 设置为 True
if s[i] == s[j]:
    if j - i + 1 <= 2 or dp[i + 1][j - 1]:
        dp[i][j] = True
  1. 同时,更新最长回文子串的起始位置和长度,并记录下来。
if j - i + 1 > max_len:
    max_len = j - i + 1
    start = i
  1. 循环结束后,返回字符串 s 中最长回文子串,即 s[start:start + max_len]
return s[start:start + max_len]

这样,就完成了找到字符串中最长回文子串的任务。

运行效果截图

调用示例

solution = Solution()
s = "babad"
s1 = "cbbd"
print(solution.longestPalindrome(s))

print(solution.longestPalindrome(s1))

运行结果

在这里插入图片描述

完结

在这里插入图片描述

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

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

相关文章

【网络编程】Linux服务器程序规范相关内容

文章目录 1、日志1.1、syslog()函数 2、用户信息2.1、UID、EUID、GID、EGID 3、进程间关系3.1、进程组3.2、会话 4、服务器程序后台化&#xff08;守护进程&#xff09; 1、日志 Linux提供一个守护进程rsyslogd来处理系统日志&#xff0c;系统日志中包括用户进程产生的日志以及…

VUE2基础-Vue实例

Vue 实例 创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({// 选项 }) 虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名…

交换:交换机相关技术(二层技术)

目录 VLAN&#xff1a;虚拟局域网 VLAN种类&#xff1a; 接口分配链路类型 接口划分VLAN 跨网段的通讯 VLAN&#xff1a;虚拟局域网 LAN &#xff1a;局域网 MAN&#xff1a;城域网 WAN&#xff1a;广域网 1.一个VLAN相当于一个广播域 VLAN&#xff1a;通过路由器和交换机…

PADS Logic如何对原理图页面进行操作呢?

在绘制复杂的原理图时&#xff0c;会根据功能模块来将原理图进行分页处理&#xff0c;在绘制原理图过程中&#xff0c;会对原理图页面进行一些处理&#xff0c;操作方法如下所列&#xff1a; 1、页面拷贝与粘贴&#xff1a;在原理图中选中需要复制的元件走线等&#xff0c;左击…

Git常用命令及在Idea中如何使用创建分支等,详讲带图[保姆级]

文章目录 Git在Git命令行中执行下面命令:设置基本信息获取Git仓库Git 工作区 暂存区 版本库概念工作状态远程仓库操作分支操作标签分类 Idea中使用推送到远程仓库(提交并且推送)分支操作 Git 在Git命令行中执行下面命令: 设置基本信息 设置用户信息 git config --global use…

阿里巴巴开源的Spring Cloud Alibaba手册在GitHub上火了,完整版开放下载

“微服务架构经验你有吗&#xff1f;” 前段时间一个朋友去面试&#xff0c;阿里面试官一句话问倒了他。实际上&#xff0c;不在BAT这样的大厂工作&#xff0c;是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得&#xff0c;让各个大厂都抢着要这样的人才&#x…

Bash 第十行

195 第十行 给定一个文本文件 file.txt&#xff0c;请只打印这个文件中的第十行。 示例: 假设 file.txt 有如下内容&#xff1a; Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10 你的脚本应当显示第十行&#xff1a; Line 10 来源&#xff1a;…

NITIRE 2023官方的PSNR及SSIM计算代码

NITIRE 2023官方的PSNR及SSIM计算代码 问题描述 做图像复原任务时&#xff0c;总避免不了计算PSNR和SSIM等图像质量评估指标&#xff0c;但是网上实在是太多计算这类指标的代码了&#xff0c;不同代码计算的结果还可能存在差异。有使用matlab计算SSIM的&#xff0c;也有使用py…

7月23作业

2.作业 platform驱动实现 platform.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/slab.h> #include <linux/io.h> #include&l…

CDN技术(Content Delivery Network,内容分发网络)分布式网络架构(CND与P2P(Peer-to-Peer)区别)

文章目录 CDN是什么&#xff1f;CDN的优势CDN的应用1. 静态内容加速2. 动态内容加速3. 视频流媒体4. 软件分发5. 游戏加速6. 移动应用加速 CDN收费吗&#xff1f;CND与P2P区别什么是静态内容和动态内容&#xff1f; CDN是什么&#xff1f; CDN&#xff08;Content Delivery Ne…

七大排序算法——直接选择排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、直接选择排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递…

基于linux下的高并发服务器开发(第一章)- Makefile(1)1.10

01 / 什么是Makefile 02 / Makefile文件命名和规则 &#xff08;1&#xff09;在~/Linux/lesson7目录下,vim Makefile &#xff08;2&#xff09;ll查看当前目录下的文件信息 &#xff08;3&#xff09;编辑以下内容,然后保存并退出 app:sub.c add.c mult.c div.c main.c gcc…

熊猫代阅脚本-沉睡者IT技术分享

熊猫代阅脚本-我的编程技术之路 熊猫阅读app是一款酷炫的阅读应用带来了多样化的阅读模式&#xff0c;熊猫阅读app专注网络小说阅读&#xff0c;更新快&#xff0c;让大家获得最好的小说阅读体验&#xff0c;有需要的快来下载。 熊猫阅读app亮点 阅读赚钱&#xff1a;越读越…

DAY46:动态规划(七)01背包应用:分割等和子集+最后一块石头重量Ⅱ+目标和

文章目录 416.分割等和子集&#xff08;回溯01背包&#xff09;思路回溯解法&#xff08;类似组合总和Ⅱ&#xff09;回溯解法存在的问题 01背包思路为什么能抽象成背包问题 01背包写法1&#xff1a;常规写法&#xff0c;考虑重量价值重量价值类问题的思考方式DP数组含义递推公…

综合小实验

第一步&#xff1a;计划IP R1的环回&#xff1a;192.168.1.0/28 R2的环回&#xff1a;192.168.1.16/28 R123的O/O/0接口&#xff1a;192.168.1.32/28 R3-4&#xff1a;192.168.1.128/30 Vlan2&#xff1a;192.168.1.48/28 vlan3&#xff1a;192.168.1.64/28 192.168.1.0/24 0区…

力扣 279. 完全平方数

一、题目描述 给你一个整数 n&#xff0c;返回和为 n 的完全平方数的最少数量 。 完全平方数是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 …

3Ds max入门教程:创建马来西亚双子塔3D模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 最终图像&#xff1a; 步骤-1 下面给出了这个双子塔的基本轮廓。 步骤-2 由于它是一栋88层的建筑&#xff0c;所以我一开始打算把它建到40层。为此&#xff0c;我使用标准的基元类型&#xff1a;盒子和圆…

python 使用 subprocess 实现交互式命令的非交互式执行

背景 想要定时执行某些脚本, 但是脚本是交互式的, 例如下面的bat 脚本 echo offset /p nameName: echo Name is %name%echo exit set /p byeBye: echo Bye is %bye%需要先输入Name, 在看到 exit 后在输入 Bye, 然后程序退出. 解决方案 使用subprocess 来实现 import subpr…

【Solidworks加密软件】Solidworks图纸文件加密方法

Solidworks是一款广泛应用于机械设计和工程领域的三维建模软件。由于Solidworks文件中可能包含敏感的设计和知识产权信息&#xff0c;保护这些图纸的安全性变得至关重要。本文将介绍Solidworks图纸加密的方法和最佳实践&#xff0c;以确保文件的机密性和安全性。 为什么需要加…

Redis字典

1.前言 我们回顾一下之前讲到的Redis的字典结构&#xff0c;示意图如下&#xff1a; Redis的字典本质上来说也是数组链表的数据结构&#xff0c;这与Java中HashMap的数据结构很类似。 由上述结构示意图也能看出&#xff0c;字典dict中维护了一个ht数组&#xff0c;而且只有两…