【力扣算法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))

运行结果


完结


相关文章
|
23天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
44 0
|
24天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
45 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
6天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
10 3
|
8天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
25 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
13天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
21天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
44 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
12天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
30天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
9天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
10天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。