【LeetCode] 5最長回文サブストリング题解

問題の説明

ストリング所与仮定すると、最長のサブストリングパリンドロームを見つけるため、Sは 1000の最大長さです。

例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是正确的答案
复制代码

例 2:

Input: "cbbd"
Output: "bb"
复制代码

難しさ

Medium

問題解決のためのアイデア

回文の対称性を指摘し、我々だけトラバースする必要がSの各文字が回文センター、各センターの回文であると仮定すると、プロセスを、私たちはその対称性検出ながら、見つけるために、両サイドに展開していき横断するとき回文、およびレコード長の境界は、最終的には、sが後で、我々が調べたすべての回文を、もちろん、取得することができるパリンドロームをサブストリング最長。この方法の時間複雑O(n^2)​

なお、回文二つの形式:単一施設および2-センター、私たちは、それぞれの文字を歩くとき、だけではなく、また、現在、単一の中央回文センターなどの文字が、現在の文字として次の文字へパリンドロームダブルセンターを中心に、それぞれ2は、中心の両側に延長。

次のようにすべてのコードは次のとおりです。

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]
复制代码

ます。https://juejin.im/post/5cf7d335e51d4556f76e8058で再現

おすすめ

転載: blog.csdn.net/weixin_34162401/article/details/91455409