python 切割回文字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 切割回文字符串相关的知识,希望对你有一定的参考价值。

"""
input: habbafgh
output: h, abba, f, g, h

solution: use Manacher (algorithm to find the longest string)
"""


def manacher(s, length):
    p = [0] * length
    mx = 0
    Id = 0
    for i in range(1, length):
        if mx > i:
            p[i] = min(p[2*Id-i], mx - i)
        else:
            p[i] = 1
        while i + p[i] < length and s[i+p[i]] == s[i-p[i]]:
            p[i] += 1
        if p[i] + i > mx:
            mx = p[i] + i
            Id = i
    return p


def cut_str(s, output):
    new_s = "#" + "#".join(list(s)) + "#"
    p = manacher(new_s, len(new_s))
    mx = max(p)
    Id = p.index(mx)
    if mx <= 2:
        output.extend(list(s))
    else:
        sub_str = "".join(c for c in new_s[Id-mx+1:Id+mx] if c != "#")
        new_index = s.index(sub_str)
        cut_str(s[:new_index], output)
        output.append(sub_str)
        cut_str(s[new_index+len(sub_str):], output)


def main():
    output = []
    s = "habbafgh"
    cut_str(s, output)
    print(",".join(output))


if __name__ == "__main__":
    main()

以上是关于python 切割回文字符串的主要内容,如果未能解决你的问题,请参考以下文章

NOI题库 / 2.6基本算法之动态规划 - 8471:切割回文

LeetCode回溯算法#05分割回文串(复习双指针判断回文以及substr函数使用记录)

(回溯法)Java 求解分割回文串

POJ 8471 切割回文 dp北大ACM/ICPC竞赛训练

LeetCode——palindrome-partitioning-ii*

(动态规划)1547. 切棍子的最小成本(区间dp)/221. 最大正方形 / 1312. 让字符串成为回文串的最少插入次数(区间dp)