leetcode-5:最长回文子串

简介: leetcode-5:最长回文子串

题目

题目链接

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

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

示例 2:

输入:s = "cbbd"
输出:"bb"

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

解题

方法一:动态规划

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        dp = [[False] * n for _ in range(n)]
        ans = ""
        # 枚举子串的长度 l+1
        for l in range(n):
            # 枚举子串的起始位置 i,这样可以通过 j=i+l 得到子串的结束位置
            for i in range(n):
                j = i + l
                if j >= len(s):
                    break
                if l == 0:
                    dp[i][j] = True
                elif l == 1:
                    dp[i][j] = (s[i] == s[j])
                else:
                    dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
                if dp[i][j] and l + 1 > len(ans):
                    ans = s[i:j+1]
        return ans

但是官方的解法超时了。(而且l和1看不太清)

于是将他改一下

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n < 2:return s   ######
        dp = [[True] * n for _ in range(n)] #########
        res = s[0] ####因为间隔直接从1开始了,所以初始res取个长度为1的就行了
        for length in range(1,n): ########从1开始
            for left in range(n):
                right = left + length  
                if right >= n:
                    break
                ######删了一行
                elif length == 1:
                    dp[left][right] = (s[left] == s[right])
                else:
                    dp[left][right] = dp[left+1][right-1] and (s[left] == s[right])
                if dp[left][right] and length + 1 > len(res):
                    res = s[left: right+1]
        return res
相关文章
|
2月前
|
算法
LeetCode算法题---最长回文子串、N 字形变换(四)
LeetCode算法题---最长回文子串、N 字形变换(四)
29 0
|
28天前
|
存储 算法 Java
【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)
12 2
|
28天前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
2月前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
18 2
|
2月前
|
索引
力扣---最长回文子串(动态规划)
力扣---最长回文子串(动态规划)
|
2月前
|
存储 算法 Go
LeetCode第五题: 最长回文子串
给定一个字符串 `s`​,找到 `s`​ 中最长的回文子串。你可以假设 `s`​ 的最大长度为 1000。
LeetCode第五题: 最长回文子串
|
12月前
【LeetCode 训练营 3,5】无重复字符的最长子串+最长回文子串
【LeetCode 训练营 3,5】无重复字符的最长子串+最长回文子串
60 1
|
2月前
|
算法 Go
golang力扣leetcode 5.最长回文子串
golang力扣leetcode 5.最长回文子串
34 1
|
2月前
|
算法 C#
Leetcode算法系列| 5. 最长回文子串
Leetcode算法系列| 5. 最长回文子串
|
2月前
|
算法
力扣5、 最长回文子串
力扣5、 最长回文子串