最长回文串之中心扩散法

最长回文串之中心扩散法


题目描述

leetcode

5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

算法思想

    比如回文串:"aba"、 "aa",我们可以观察到它两边是互为镜像的,那我们就可以从回文字符串的中心字符开始向两边扩散,获取到以此位置为中心的字符串长度。

    但奇数串和偶数串的中心位置是不一样的,如"aba"中心位置是1,而"aa"是处于两字符之间。

    Python3的大致代码如下:

class Solution:
    def longestPalindrome(self, s: str) -> str:
    	# 如果字符串是“”,“a“,之类的直接返回即可
        if len(s) < 2:
            return s

        # 定义最长字符串的初始左右边界    
        left = 0
        right = 0

        # 从第一个字符开始以它为中心向两边扩散
        for i in range(0, len(s)):
        	# 奇数情况下的回文长度
            len1 = self.expandAroundCenter(s, i, i)
            # 偶数情况下的回文长度
            len2 = self.expandAroundCenter(s, i, i + 1)
            # 取最大回文长度
            len3 = max(len1, len2)
            # 更新左右边界值
            if len3 > right - left:
                left = i - int((len3 - 1) / 2)
                right = i + int(len3 / 2)
        print(left, right+1)
        return s[left:right+1]

    def expandAroundCenter(self, s: str, left: int, right: int) -> int:
    	# 返回当前字符向两边扩散的回文串长度
        l = left
        r = right
        while l >= 0 and r < len(s) and s[l] == s[r]:
            l = l - 1
            r = r + 1
        return r - l - 1


if __name__ == "__main__":
    s = Solution()
    assert s.longestPalindrome("babad") == "bab" or s.longestPalindrome("babad") == "aba"
    assert s.longestPalindrome("cbb") == "bb"
    param = "kyyrjtdplseovzwjkykrjwhxquwxsfsorjiumvxjhjmgeueafubtonhlerrgsgohfosqssmizcuqryqomsipovhhodpfyudtusjhonlqabhxfahfcjqxyckycstcqwxvicwkjeuboerkmjshfgiglceycmycadpnvoeaurqatesivajoqdilynbcihnidbizwkuaoegmytopzdmvvoewvhebqzskseeubnretjgnmyjwwgcooytfojeuzcuyhsznbcaiqpwcyusyyywqmmvqzvvceylnuwcbxybhqpvjumzomnabrjgcfaabqmiotlfojnyuolostmtacbwmwlqdfkbfikusuqtupdwdrjwqmuudbcvtpieiwteqbeyfyqejglmxofdjksqmzeugwvuniaxdrunyunnqpbnfbgqemvamaxuhjbyzqmhalrprhnindrkbopwbwsjeqrmyqipnqvjqzpjalqyfvaavyhytetllzupxjwozdfpmjhjlrnitnjgapzrakcqahaqetwllaaiadalmxgvpawqpgecojxfvcgxsbrldktufdrogkogbltcezflyctklpqrjymqzyzmtlssnavzcquytcskcnjzzrytsvawkavzboncxlhqfiofuohehaygxidxsofhmhzygklliovnwqbwwiiyarxtoihvjkdrzqsnmhdtdlpckuayhtfyirnhkrhbrwkdymjrjklonyggqnxhfvtkqxoicakzsxmgczpwhpkzcntkcwhkdkxvfnjbvjjoumczjyvdgkfukfuldolqnauvoyhoheoqvpwoisniv"
    assert s.longestPalindrome(param) == "qahaq"
posted @ 2020-06-21 11:39  lw007  阅读(421)  评论(0)    收藏  举报