【力扣第五题】-- 最长回文子串(python版本)

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”

解题思路

本题考虑使用动态规划求解,有以下两种情况需要考虑:
(1) 如果一个字符串是回文串,那么在它左右分别加上一个相同的字符,那么它一定还是一个回文串;
(2) 如果在一个不是回文字符串的字符串两端添加任何字符,或者在回文串左右分别加不同的字符,得到的一定不是回文串。

具体代码

def run(s):
    n = len(s)
    ans = ''
    # 构造二维数组
    dp = [[False] * n for _ in range(n)]
    # m表示子串的长度
    for m in range(n):
        for i in range(n):
            # i为子串的开始位置,j记录子串的结束位置
            j = i + m
            if j >= n:
                break
            # 若只有一个子串,则为回文子串
            if m == 0:
                dp[i][j] = True
            # 若子串的长度是2,若两个字符相等,则为回文子串
            elif m == 1:
                dp[i][j] = (s[i] == s[j])
            # 若子串的长度超过2,则看最左和最右的字符是否相等,且以前的字符是否是回文子串
            else:
                dp[i][j] = (s[i] == s[j] and dp[i + 1][j - 1])
            # 若子串满足回文子串的要求,且子串的长度大于现有的子串ans的长度,则更新ans
            if dp[i][j] and m + 1 > len(ans):
                ans = s[i:j + 1]
    return ans


def main():
    s = str(input())
    res = run(s)
    print(res)
main()

复杂度

时间复杂度为O(n^2)
空间复杂度为O(n^2)

你可能感兴趣的:(刷题,力扣)