使用python(大O表示法)找到任何给定字符串中最大的回文

时间:2015-04-21 23:15:05

标签: python big-o palindrome notation

我想知道这段代码是哪种O符号,有人可以帮我搞清楚吗?我写了它,但当我被问及哪种O符号是什么时,我唯一可以说它是线性的,但我觉得递归+迭代应该是指数的?

listPlindromes = []

def palindrome( givenString, n ):
    if n == 1:
        #print givenString
        return None
    else:
        #print givenString[:n]
        #print ('forward: '+givenString[:n] +'  backwards: '+givenString[:n][::-1])

        #Get difference between lengths
        lenDifference = len(givenString) - len(givenString[:n])

        #If there is a difference means there at least one more word/palindrome could exist
        #therefore it need to be tested
        if lenDifference > 0:
            for xTest in range(0,lenDifference-1) :
                newWord=givenString[xTest:n+xTest]
                if newWord == newWord[::-1]:
                    if len(newWord) > 0:
                        listPlindromes.append(newWord)
                        #print newWord
        else:
            if givenString[:n] == givenString[:n][::-1]:
                    listPlindromes.append(givenString[:n])
            #print('palindrome: '+givenString)

        return palindrome(givenString,n-1)

givenString='osooso'

palindrome(givenString, len(givenString))
print(listPlindromes)

2 个答案:

答案 0 :(得分:1)

你所获得的代码以线性时间运行;也就是说,它的主要瓶颈是你给它的字符串有多大。

尽管如此,有些事情可以改进:

  • 您只需要传入字符串
  • 长度为1的字符串是回文
  • 有很多不必要/不需要的长度检查;只需将字符串切成两半即可开始检查

至于迭代+递归方法,它实际上取决于它是如何创作的,但我有一个递归方法,也可能是O(n)。

  • 从整个字符串开始。
  • 如果两端匹配:
    • 如果字符串的一边*的长度大于1,则从该位置取一片,最后比最后一个字符少1。
    • 调用功能。
  • 如果两端匹配并且字符串的一边*的长度小于或等于1,我们就完成了 - 返回true。
  • 否则:
    • 返回错误,因为我们发现了不匹配。

*:无论字符串是偶数还是奇数,将它切成两半都会在两边都给出偶数个字符。

答案 1 :(得分:-1)

简单解决方案:

def palchecker(aString):
    aString = aString.lower()
    reverse = aString[::-1]

    if aString == reverse:
        return True

    return(False)

print(palchecker("lsdkjfskf"))
print(palchecker("aIbohPhoBiA"))