1

5. 最长回文子串

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

示例 1:

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

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

提示:

- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成

🚩 思路1:通过中心扩散双指针来计算最长回文串,这里需要注意的是奇偶数,如果回文串的长度为奇数,则它有一个中心字符;如果回文串的长度为偶数,则可以认为它有两个中心字符。

class Solution:
    # 那么可以事先写一个函数,在 s 中寻找以 s[left] 和 s[right] 为中心的最长回文串(即s[left]==s[right],然后在不越界的前提下左移left,右移right),
    # 这样,如果输入相同的 left 和 right,就相当于寻找长度为奇数的回文串,如果输入相邻的 left 和 right,则相当于寻找长度为偶数的回文串

    def spread(self, s, left, right):
        while left >= 0 and right < len(s) and s[left] == s[right]: # 防止索引越界
            left -= 1 # 双指针,向两边展开,左往左,右往右
            right += 1
        return s[left + 1: right] #返回以 s[left] 和 s[right] 为中心的最长回文串, 结束循环时left比回文串的内容多左移了一个 right多右移了一个


    def longestPalindrome(self, s:str)->str:
        if s == s[::-1]:
            return s
        res = []

        for i in range(len(s)):
            res_odd = self.spread(s, i, i) # 找到以 s[i] 为中心的回文串,奇数的时候
            res_even = self.spread(s, i, i + 1) # 找到以 s[i]和s[i+1] 为中心的回文串,偶数的时候
            res.append(res_odd)
            res.append(res_even)
        res_sort = sorted(res, key=lambda x: len(x))
        return res_sort[-1]

🚩 思路2:暴力遍历法,遍历每个元素时,遍历后面的元素,只有相等的时候才有可能是回文串,把这两个首尾字符的字符串进行回文判断,找到最长的即可。这种方法就是慢一些。

class Solution:
    
    def longestPalindrome(self, s:str)->str:
        n = len(s)
        ans = s[0]
        if n == 1:
            return ans
        for i in range(len(s)):
            for j in range(i+1, len(s)):
                if s[i] == s[j]:
                    res = s[i: j+1]
                    if res == res[::-1] and len(res) > len(ans):
                        ans = res
        return ans
posted @ 2024-05-30 09:45  Bonne_chance  阅读(7)  评论(0编辑  收藏  举报
1