def is_palindrome(s):
if len(s) <= 1:
return True
return s[0] == s[-1] and is_palindrome(s[1:-1])
我的第一个想法是复杂度为O(n),因为每次递归调用都会删除2个字符。
但后来我想到了切片的复杂性。根据{{3}},获得切片的复杂度是O(k),其中k =切片中元素的数量。在is_palindrome
中,k = n - 2,然后k = n - 4,然后是n - 6,等等,所以我认为复杂度为O(n ^ 2),因为每次调用都有(最差)O (n)切片,有n个电话。
哪一个是正确的?
答案 0 :(得分:2)
想象一下,你有经典的O(n^2)
算法:双嵌套for循环
for i in range(n):
for j in range(n):
#do_something
对于外循环的每次迭代,必须执行内循环O(n)
的整个迭代。这会导致O(n^2)
运行时。
现在让我们来看看你的算法 - 对于每个递归级别,必须调用另一个O(n)
算法(你的切片) - 你的递归函数类似于外部循环和你的切片函数类似于内循环。
你的递归函数是
O(n/2) => O(n)
你的切片功能是
O(t) where t < n
确定字符串是否为回文的另一种O(n)
方法是简单地迭代字符串一次,并在每次迭代中检查列表的两端。请记住索引访问是O(1)
for i in xrange(len(s)/2):
if s[i] != s[(len(s)-1)-i]:
return False
return True