Leetcode最長迴文子串

LeetCode 上的題目 "Longest Palindromic Substring"(最長迴文子串)的目標是在一個字元串中找到最長的迴文子串。一個字元串是迴文的,如果它從中間向兩邊讀都是一樣的,例如 "aba", "xyyx", "aabcdcba"。

這個問題的解法可以分為兩種主要類型:中心擴展法和動態規劃法。

  1. 中心擴展法: 這種方法的基本思路是從字元串的每一個位置開始,嘗試擴展左右兩邊的字元,直到不能擴展或者找到一個最長的迴文子串。這種方法可以在線性時間內解決問題,但是它的空間複雜度可能很高,因為它需要一個長度為 2*n 的緩衝區來存儲擴展的字元串。

  2. 動態規劃法: 這種方法使用一個長度為 n 的數組來記錄從每個位置開始的最長迴文子串的長度。對於每個位置 i,我們檢查字元 s[i] 是否等於 s[i - palindrome[i - 1]],如果等於,那麼我們將 palindrome[i] 設置為 palindrome[i - 1] + 1,否則,我們將 palindrome[i] 設置為 1。最後,我們找到最大的 palindrome 值,這個值就是最長迴文子串的長度。

以下是一個使用動態規劃法解決這個問題的 Python 實現:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n == 0:
            return ""
        palindrome = [0] * n
        for i in range(n):
            palindrome[i] = 1
            if i > 0 and s[i] == s[i - 1]:
                palindrome[i] = palindrome[i - 1] + 1
            if i >= 2 and s[i] == s[i - 2] and palindrome[i - 2] > 0:
                palindrome[i] = max(palindrome[i], palindrome[i - 2] + 1)
        max_len = 0
        max_start = 0
        for i in range(n):
            if palindrome[i] > max_len:
                max_len = palindrome[i]
                max_start = i - max_len + 1
        return s[max_start:max_start + max_len]

這個算法的時間複雜度是 O(n^2),空間複雜度是 O(n)。如果你想要一個線性時間的解決方案,你可以使用中心擴展法,但是你需要額外的空間來存儲擴展的字元串。