【问题标题】:Fastest way to check if a string contains a palindrome substring检查字符串是否包含回文子串的最快方法
【发布时间】:2021-10-12 22:41:02
【问题描述】:

我正在尝试检查一个字符串是否包含任何长度 > 1 的子字符串,这是一个回文。 (请注意,这与检查整个字符串是否为回文是不同的。)我能够编写一个查找偶数或奇数回文子串的函数。我已经尽我所能对其进行了优化,但是我的代码超出了一些测试用例的时间限制。

如何改进算法以使其更快?

def findPalindrome(s):
    ans = ""
    for i in range(len(s)):
        for k in range(2):
            temp = str_parser(s, i, i + k)
            if len(temp) > len(ans) and len(temp) > 1:
                return 1
    return 0


def str_parser(s, l, r):
    while l >= 0 and r < len(s):
        if s[r] == s[l] and len(s[l:r+1]) > 1:
            return s[l:r+1]
        else:
            l -= 1
            r += 1
    return ''

如果输入字符串包含回文,findPalindrome 函数返回 1,否则返回 0。

【问题讨论】:

  • 一个简单的提示:从开头和结尾开始,比较每个字母直到到达中间。
  • @Aethernite 这是检查子串回文,而不仅仅是单词本身
  • 检查 Manacher 的算法以找到 O(N) 中的所有子回文。您当然可以修改算法以在第一个找到的回文上返回 true。

标签: python string algorithm substring palindrome


【解决方案1】:

由于您只是要求长度大于 1 的回文,因此查找模式 aaaba 就足够了。这是在一次线性传递中完成的,最坏的情况是进行N-1+N-2 比较(最好是1 比较)。

【讨论】:

    【解决方案2】:

    正如已经指出的,您所要做的就是检查是否存在长度为 2 或 3 的回文:

    def findPalindrome(s):
        return any(x==y for x,y in zip(s, s[1:])) or any(x==y for x,y in zip(s, s[2:]))
    

    或者更简洁:

    return any(c in s[i+1:i+3] for i, c in enumerate(s))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2011-03-19
      • 2012-12-27
      • 2011-11-09
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多