【问题标题】:Longest Palindrome: What could be slowing down my DP solution?最长回文:什么可能会减慢我的 DP 解决方案?
【发布时间】:2020-12-19 05:14:27
【问题描述】:

这是我对以下 leetcode 问题的解决方案:https://leetcode.com/problems/longest-palindromic-substring/

找到最长的回文子串(回文是前后相同的字符串)。

我的解决方案以某种方式通过了他们所有的测试用例,但超出了时间限制。我已经实现了一个基于 DP 的解决方案,但不知道什么可能需要额外的时间。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        table = [[True] for i in range(len(s))]
        best = (0,1)
        for i in range(len(s) - 1):
          for j in range(0, len(s) - i -1):
            size = i + 1
            shift = j
            diag = table[j + 1][i-1]
            eq = s[shift] ==  s[shift + size]
            table[j].append(diag and eq)
            if diag and eq: best = (shift,  shift + size + 1)
        return s[best[0]:best[1]]

【问题讨论】:

  • 您没有遗漏任何细微的细节 - 您的算法很慢,原因很简单,因为这些循环需要二次时间。你需要一个更好的算法。
  • 我不知道这可以比二次方更快。我得再考虑一下。

标签: python dynamic-programming palindrome


【解决方案1】:

这是解决问题的一种方法,
首先定义一个窗口大小(如滑动窗口),然后尝试使用该窗口大小对字符串进行切片并检查它是否为回文。

如果您在没有任何解决方案的情况下到达终点,只需减小窗口大小并重新开始,直到找到回文。

这是一个示例代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        window_size = len(s)
        while True:
            for i in range(0, (len(s) - window_size) + 1):
                if s[i : i + window_size] == s[i:i + window_size][::-1]:
                    return s[i : i + window_size]
            else:
                window_size -= 1

问题的sn-p结果与这个答案的比较(分别):

【讨论】:

  • 这比问题中的算法还要慢。
  • 不是。我们从最长的子串开始,一直到更小!
  • @user2357112supportsMonica 我已在我的答案中添加了结果比较供您查看
  • “我们从最长的子串开始,一直到更小”——这并不能让它更快。如果最长的回文子串占据了原始字符串的大部分,它运行得很快,但如果最长的回文子串很短,它就会非常慢。
  • @user2357112supportsMonica 这不是代码审查。 Op 的答案因超过时间限制而未被接受,我提供了一个有效的答案(实际上并没有声称它更好)。我真的不明白你在说什么,但按照你的方式去做。
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多