LeetCode 第5题:最长回文子串Python3解法

1:问题描述

来源:LeetCode

难度:中等


问题详情:
给你一个字符串 s,找到 s 中最长的回文子串。

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


2:问题分析

首先要明确什么叫回文子串。回文子串的定义是一个字符串中正序和反序一样的子串。比如“sabccbad”中就存在回文子串"abccba"

2.1 时间复杂度和空间复杂度

在真正开始介绍各种算法前,先以表格形式展示各自的时间复杂度和空间复杂度, n n n 表示字符串 s s s 的长度。

算法 时间复杂度 空间复杂度
暴力for循环 O( n 3 n^3 n3) O( n n n)
动态规划 O( n 2 n^2 n2) O ( n 2 ) O(n^2) O(n2)
中心扩展 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)

2.2 暴力for循环

首先容易想到的就是是双层for循环遍历所有字符子串,然后判断该子串是否为回文子串。

代码较为简单,如下所示:

def longestpalindrome(s: str) -> str:
    """
    一个最直接的思路就是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的
    缺点:面对超长字符串,容易超时

    :param s:
    :return:
    """
    length = len(s)

    max_len = 0
    result = ''
    for i in range(length):
        for j in range(i, length + 1):
            sub_str = s[i:j]
            rever_str = sub_str[::-1]
            # 因为这个判断的次数是n次,而两层for循环时间复杂度为O(n²),因此时间复杂度为O(n³)
            if sub_str == rever_str:
                if len(sub_str) > max_len:
                    result = sub_str
                    max_len = len(sub_str)

    return result

虽然该思路较为简单易懂,但是时间复杂度也是相当的高,两层for循环的时间复杂度O( n 2 n^2 n2),同时在for循环内部对比是否为回文子串的时间复杂度为O( n n n),因此整个算法的时间复杂度为O( n 3 n^3 n3)。

对于空间复杂度,因为需要存储字符子串,而子串的最大长度与原字符串相等,所以空间复杂度为O( n n n).

2.3 动态规划法

2.3.1 思路

看答案不难想到

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...