0
点赞
收藏
分享

微信扫一扫

python 最长回文子串 多种解法

時小白 2023-12-12 阅读 31

动态规划法

def longestPalindromeDP(s: str) -> str:
    n = len(s)
    dp = [[False] * n for _ in range(n)]
    ans = ""
    # 遍历长度
    for l in range(n):
        # 遍历起点
        for i in range(n - l):
            j = i + l
            if l == 0:
                dp[i][j] = True
            elif l == 1:
                dp[i][j] = (s[i] == s[j])
            else:
                dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
            if dp[i][j] and l + 1 > len(ans):
                ans = s[i:j + 1]
    return ans

中心扩散法

def longestPalindromeCenter(s: str) -> str:
    def expandAroundCenter(left, right):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left + 1:right]

    if len(s) < 1:
        return ""
    longest = ""
    for i in range(len(s)):
        str1 = expandAroundCenter(i, i)
        str2 = expandAroundCenter(i, i + 1)
        longest = max(longest, str1, str2, key=len)
    return longest

Manacher 算法

def preProcess(s: str) -> str:
    if not s:
        return "^$"
    T = "^"
    for i in range(len(s)):
        T += "#" + s[i]
    T += "#$"
    return T

def longestPalindromeManacher(s: str) -> str:
    T = preProcess(s)
    P = [0] * len(T)
    center, right = 0, 0
    for i in range(1, len(T) - 1):
        i_mirror = 2 * center - i
        if right > i:
            P[i] = min(right - i, P[i_mirror])
        while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
            P[i] += 1
        if i + P[i] > right:
            center, right = i, i + P[i]
    max_len, center_index = max((n, i) for i, n in enumerate(P))
    start = (center_index - max_len) // 2
    return s[start:start + max_len]

举报

相关推荐

0 条评论