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

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

问题描述


给你一个字符串 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
  • 同时,更新最长回文子串的起始位置和长度,并记录下来。
  1. 循环结束后,返回字符串 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))

运行结果


完结


相关文章
|
19天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
212 55
|
7天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
11天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
49 20
|
4天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
9天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
41 5
|
9天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
43 0
|
10天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
143 80
|
3天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
6天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
2天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。