leetcode刷题-5.最长回文子串(三种解法)

1.题目

在这里插入图片描述

2.题目意思

找出回文串,注意bad不是回文串,bab才是。

特殊情况就是空字符串返回空,单个字符串返回单个,无回文串返回第一个字母。

3.代码

解法1:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        m = len(s)
        if m == 0:
            return ''
        maxS = s[0]
        for i in range(m):
            for j in range(i+1, m+1): # 请细品
                strr = s[i:j]
                strr1 = strr[::-1]
                if strr == strr1 and len(strr)>len(maxS):
                    maxS = strr
        return maxS

思路:暴力

运气好就能过,运气不好就tle。代码是没什么问题,注意j的取值是range(i+1, m+1),可以细细想想为什么~

解法2:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        m = len(s)
        if m < 2:
            return s
        res = [[False for _ in range(m)] for _ in range(m)]
        le, re ,maxLen = 0, 0, 0
        
        for i in range(m):
            for j in range(i+1): # j<=i
                if s[i] == s[j] and (i-j < 2 or res[j+1][i-1]):
                    res[j][i] = True
                    if maxLen < i -j + 1:
                        maxLen = i-j+1
                        le, re = j, i
        return s[le:re+1]

思路:dp

初始化记录好回文串的左右索引和长度。

dp递推公式是,当回文串长度小于2时,一定是回文串;当长度大于2时,如果s[i]==s[j]s[i+1, j-1]是回文串时,s[i, j]是回文串。

循环的jrange(i+1)是为了保证j<=i。另外,循环时往回搜索是因为之前的状态时清楚的,如果往后搜索,状态是不清楚的。

解法3

class Solution:
    def longestPalindrome(self, s: str) -> str:
        m = len(s)
        if m < 2:
            return s

        def center(left, right):
            L, R = left, right
            while L >= 0 and R <len(s) and s[L] == s[R]:
                L -= 1
                R += 1
            return R - L - 1

        left, right = 0, 0
        for i in range(len(s)):
            len1 = center(i, i) # 奇数
            len2 = center(i, i+1) # 偶数
            max_len = max(len1, len2)
            if max_len > right - left:
                left = i - (max_len - 1)//2
                right = i + max_len//2
        return s[left:right+1]

思路:中心法

找出最长回文串的中心。中心可能是一个词如dad也可能是两个词如daad,因此两个都试一遍然后取最长,如果确实存在,则更新。

冲冲冲~

发布了18 篇原创文章 · 获赞 1 · 访问量 791

猜你喜欢

转载自blog.csdn.net/shuaishuaihyh/article/details/105555621