問題の説明
ストリング所与の仮定すると、最長のサブストリングパリンドロームを見つけるため、Sは 1000の最大長さです。
例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是正确的答案
复制代码
例 2:
Input: "cbbd"
Output: "bb"
复制代码
難しさ
Medium
問題解決のためのアイデア
回文の対称性を指摘し、我々だけトラバースする必要がSの各文字が回文センター、各センターの回文であると仮定すると、プロセスを、私たちはその対称性検出ながら、見つけるために、両サイドに展開していき横断するとき回文、およびレコード長の境界は、最終的には、sが後で、我々が調べたのすべての回文を、もちろん、取得することができるのパリンドロームをサブストリング最長。この方法の時間複雑。
なお、回文二つの形式:単一施設および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で再現