LeetCode每日一题——T5. 最长回文子串(中):中心扩散法、未完待续

法一、中心扩散法:以字符串某元素(奇数扩散中心,对应子串长度为奇数)或某两相同元素中间(偶数扩散中心,对应子串长度为偶数)为中心,分别向两端扩散,如果两端元素相同,则继续扩散,不相同则退出,保留当前子串;更换中心元素,直至找到最长回文子串。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        s_len = len(s)
        if s_len == 0:
            return ''
        _palindrome_len = 1
        _palindrome_str = s[0]
        
        for i in range(s_len):
            palindrome_odd, odd_len = self._center_spread(s, s_len, i, i)
            palindrome_even, even_len = self._center_spread(s, s_len, i, i+1)
            # 调用函数,分别以s[i](子串长度为奇数)、s[i]和s[i+1]的中间(长度为偶数)为中心进行扩散,寻找最长回文子串
            
            cur_max_str = palindrome_odd if odd_len > even_len else palindrome_even
            if len(cur_max_str) > _palindrome_len:
                _palindrome_len = len(cur_max_str)
                _palindrome_str = cur_max_str
        
        return _palindrome_str
    
    def _center_spread(self, s , s_len, left, right):		# 定义寻找最长回文子串函数
        l = left
        r = right
        while l >= 0 and r < s_len and s[l] == s[r]:
            l -= 1
            r += 1
        return s[l+1 : r], r - l - 1    # 注意此处s[l+1 : r]是输出s[l+1], s[l+2], ... s[r-1]

思路来源:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

你可能感兴趣的:(代码)