leetcode 5:最長迴文子串

題目描述

Given a string s, find the longest palindromic substring in s.
You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:

Input: "cbbd"
Output: "bb"
# -*- coding: utf-8 -*-
# @Time         : 2019-10-11 10:34
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : longestPalindromicSubstring.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

class Solution:
    """
    要查找最長的迴文子串,這裏可以把我們的思路換一下。
    原本我們判斷一個字符串是不是迴文的時候,是從字符串的兩端開始往中間比較,
    而我們現在要找的是最長的迴文子串,那麼如果我們從中間開始往兩段比較,直到待比較的兩個字符不相等。

    通過不斷的將中心字符移動,這樣我們就可以找到最長的迴文子串。
    需要注意的是,在我們判斷一個字符串的是不是迴文的時候需要處理字符串個數的奇偶性
    同理,我們在移動中心字符的時候,也要處理奇數字符長度的迴文子串和偶數字符長度的迴文子串。
    """
    def longestPalindrome(self, s):
        def helper(left, right):
            """
            判斷給定一個字符串的起止點,最多能將其延長到多長。
            :param left: 起點
            :param right: 終點
            :return: 以left, right爲起止點能延長到的最長迴文字符串
            """
            # 只要下標不越界並且兩端相等,就往外延伸
            while left >= 0 and right < len(s) and s[left] == s[right]:
                left -= 1
                right += 1
            # 當不能再延伸的時候,返回當前能得到的最長迴文字符串
            return s[left + 1: right]

        ans = ''
        for i in range(len(s)):
            # 對於每一箇中心,需要判斷奇數長度的迴文子串和偶數長度的迴文子串
            odd = helper(i, i)
            if len(odd) > len(ans):
                ans = odd
            even = helper(i, i + 1)
            if len(even) > len(ans):
                ans = even
        return ans

def main():
    solution = Solution()
    s = "babad"
    print(solution.longestPalindrome(s))

if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章