[LeetCode] 5. Longest Palindromic Substring題解

問題描述

給定一個字符串 s,找出其中最長的迴文子字符串,假設 s 的最大長度爲 1000。python

例 1:bash

輸入: "babad"
輸出: "bab"
注意: "aba" 也是正確的答案
複製代碼

例 2:spa

Input: "cbbd"
Output: "bb"
複製代碼

問題難度

Mediumcode

解題思路

注意到迴文的對稱性特色,咱們只須要在遍歷 s 的過程當中,假設每個字符都是迴文的中心,對於每個迴文中心,咱們不斷向兩邊擴展,同時檢測其對稱性,找出該回文的邊界,並記錄其長度,最終,當遍歷完 s 以後,咱們便檢測了 s 中全部的迴文,固然就能夠獲得 s 中最長的迴文子字符串。這種方法的時間複雜度爲 O(n^2)​leetcode

須要注意的是,迴文有兩種形式:單中心和雙中心,因此咱們在遍歷每一個字符時,不只要把當前字符當作單中心迴文的中心,還要將當前字符和下一個字符當作雙中心迴文的中心,並分別以這兩個中心向兩邊擴展。字符串

所有代碼以下:get

class Solution():
    def expand(self, left, right, s):
        """ expand from middle point """
        if right >= len(s) or s[left] != s[right]:
            return 0

        while left-1 >= 0 and right+1 < len(s) and s[left-1] == s[right+1]:
            left -= 1
            right += 1

        return right + 1 - left

    def longest_palindrome(self, s):
        """ :type s: str :rtype: str """
        if not s:
            return ""

        middle = 0
        max_len = 0
        for i in range(len(s)):
            len1 = self.expand(i, i, s)
            len2 = self.expand(i, i+1, s)
            longer = max(len1, len2)
            if longer > max_len:
                max_len = longer
                middle = i

        begin = middle-int((max_len-1)/2)
        return s[begin:begin+max_len]
複製代碼
相關文章
相關標籤/搜索