我想要的是生成一个字符串的所有可能的排列,然后检查是否任何排列是一个回文,如果它然后我只是突破循环并分配发现是真的但我的问题面临的是代码不断给出超时错误!现在,因为我是Python的新手,我对生成器和迭代器有一个基本的了解,我希望有人指出如何有效地使用生成器来解决这个超时问题。
from itertools import permutations
string = raw_input()
for perm in permutations(string):
if perm == perm[::-1]:
found=True
break
if found==True:
print("YES")
else:
print("NO")
答案 0 :(得分:2)
生成器/迭代器不是导致此问题的原因,我认为“超时”意味着它需要太长时间(在黑客等级上)。问题是处理即使是适度短的字符串也能产生的大量排列所花费的时间。您正在考虑因子时间复杂度,因为这是给定字符串存在的排列数。
这是另一种不产生任何排列的方法。相反,这个算法只依赖于这样一个事实:只有当包含它的每个字符的计数是偶数时,或者最多只有1个字符具有奇数时,才能为字符串形成回文。
from collections import Counter
def can_form_palindrome(s):
return [v%2 for v in Counter(s).values()].count(1) < 2
if __name__ == '__main__':
if can_form_palindrome(raw_input()):
print("YES")
else:
print("NO")
答案 1 :(得分:1)
这不是发电机的问题。您的算法不是最佳的。尝试每种可能的排列都不是最好的方法,检查给定的一组字符是否可以构建一个回文。您的算法具有O(N!)的复杂度,其增长速度快于任何指数复杂度,并且指数复杂度已经非常差。但是这是一个带有O(N)的算法,与字符数成线性关系。