帕先生之回文子串问题

115 阅读2分钟

1、题目概述

给定一个字符串s, 求其回文子串, 子串是连续的

此类问题可以衍变为最长回文子串, 回文子串个数等等

如果字符串向前和向后读都相同,则它满足 回文性

2、动态规划解题思路

1、 单个字符一定是回文的, 比如a, b

2、 2个连续相等的字符也一定是回文的, 比如aa, bb

3、 用dp[i,j]表示范围从i到j的字符串是否是回文的,那么如果字符串长度超过2且dp[i][j] 是回文的, 则dp[i+1][j-1]也一定是回文的,即

dp[i][j]=dp[i+1][j1]dp[i][j] = dp[i+1][j-1]

一个字符串如果是回文的, 如果去头去尾, 剩下的字符串也一定是回文的

  1. 用二维数组来表示dp, dp[i+1][j-1]dp[i][j]的左下角,所以i的遍历顺序是从下往上, j的遍历顺序是从左到右, 因为推导式是是需要先知道i+1j-1的,同时ji的起始位置开始遍历, 因为j 一定大于等于 i

1.png

3、 LeetCode 5 最长回文子串

class Solution:
    def longestPalindrome(self, s: str) -> str:
        length = len(s)
        maxLength = 1
        begin = 0
        # 初始化的时候全置为False
        dp = [[False] * length for _ in range(length)]
        for i in range(length - 1, -1, -1): # i从下往上遍历
            for j in range(i, length): # j从左往右遍历
                if s[i] == s[j]:
                    # 一头一尾相等, 且长度不超过2, 证明是回文的
                    if j - i <= 1: 
                        dp[i][j] = True
                       # 以下是处理结果逻辑
                        if j - i + 1 > maxLength:
                            maxLength = j - i + 1
                            begin = i
                    # 如果去头去尾也是回文的, 说明当前[i, j]也必然是回文的
                    elif dp[i+1][j-1]:
                        dp[i][j] = dp[i+1][j-1]
                        # 以下是处理结果逻辑
                        if j - i + 1 > maxLength:
                            maxLength = j - i + 1
                            begin = i
        return s[begin: begin + maxLength]