algorithm - 寻找最长的回文子串(不是子序列)

标签 algorithm python-3.x dynamic-programming palindrome

我正在做 Leetcode 题找到最长的回文子串

例如,如果输入 babad,则输出可以是 bababa

如果输入是cbbd,那么输出是bb

我很确定我已经弄清楚了,这是我的代码...

def longestPalindrome(self, s):

    n = len(s)

    # Empty matrix.
    table = [[False for i in range(n)] for j in range(n)]

    # Identity matrix.
    for i in range(n):
        table[i][i] = True

    max_len = 0
    start = 0
    finish = 0

    for sil in range(2, n+1):
        for i in range(n-sil + 1):
            j = sil + i - 1
            if sil == 2:
                if s[i] == s[j]:
                    table[i][j] = True
                    max_len = j-i
                    start = i
                    finish = j
            else:
                if s[i] == s[j] and table[i+1][j-1]:
                    table[i][j] = True

                    if (j - i) > finish-start:
                        max_len = j - i
                        start = i
                        finish = j

    return s[start:finish+1]

它适用于大多数情况,除非字符串非常长。我正在提交我的代码,但在以下情况下它失败了......

"esbtzjaaijqkgmtaajpsdfiqtvxsgfvijpxrvxgfumsuprzlyvhclgkhccmcnquukivlpnjlfteljvykbddtrpmxzcrdqinsnlsteonhcegtkoszzonkwjevlasgjlcquzuhdmmkhfniozhuphcfkeobturbuoefhmtgcvhlsezvkpgfebbdbhiuwdcftenihseorykdguoqotqyscwymtjejpdzqepjkadtftzwebxwyuqwyeegwxhroaaymusddwnjkvsvrwwsmolmidoybsotaqufhepinkkxicvzrgbgsarmizugbvtzfxghkhthzpuetufqvigmyhmlsgfaaqmmlblxbqxpluhaawqkdluwfirfngbhdkjjyfsxglsnakskcbsyafqpwmwmoxjwlhjduayqyzmpkmrjhbqyhongfdxmuwaqgjkcpatgbrqdllbzodnrifvhcfvgbixbwywanivsdjnbrgskyifgvksadvgzzzuogzcukskjxbohofdimkmyqypyuexypwnjlrfpbtkqyngvxjcwvngmilgwbpcsseoywetatfjijsbcekaixvqreelnlmdonknmxerjjhvmqiztsgjkijjtcyetuygqgsikxctvpxrqtuhxreidhwcklkkjayvqdzqqapgdqaapefzjfngdvjsiiivnkfimqkkucltgavwlakcfyhnpgmqxgfyjziliyqhugphhjtlllgtlcsibfdktzhcfuallqlonbsgyyvvyarvaxmchtyrtkgekkmhejwvsuumhcfcyncgeqtltfmhtlsfswaqpmwpjwgvksvazhwyrzwhyjjdbphhjcmurdcgtbvpkhbkpirhysrpcrntetacyfvgjivhaxgpqhbjahruuejdmaghoaquhiafjqaionbrjbjksxaezosxqmncejjptcksnoq"

错误消息是超过时间限制。

这是为什么?我正在做一个动态规划解决方案,这应该是一个可以接受的答案。

最佳答案

您没有提前脱离内部循环,因此在所有情况下您仍在做 O(n²) 的工作。

考虑回文的中心必须有 'xx' 或 'x?x'。其中 x 是出现两次的任何字符,而 ?是任何字符。

对于某些病态情况,这可能不会改善最坏情况下的运行时间,但至少在您提供的示例中它应该为您节省大量计算。

关于algorithm - 寻找最长的回文子串(不是子序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47560660/

相关文章:

c++ - std::copy_n 是否适用于重叠范围?

performance - 争论我的算法是正确的并且在范围内

algorithm - 查找黑盒函数的第一个根,或同一函数的任何负值

python - 如何在我的网络应用程序上安全地接受和运行用户的代码?

algorithm - 使用动态规划时,捕获整个路径以获得最小和?

algorithm - 2D Box stacking no duplicates with height limit

c++ - 如何在图中找到 3 条边的负加权循环?

python - 权限错误 : [WinError 5] Access is denied

更新到 MacOS Monterey 后,Python3 和 'code' CLI 不工作

java - 最大化给定股票报价的利润,我在 Java 中的解决方案