【问题标题】:Python code keeps giving timeout error! iterators vs generators?Python代码不断给出超时错误!迭代器与生成器?
【发布时间】:2014-11-09 11:21:33
【问题描述】:

我想要的是生成字符串的所有可能排列,然后检查是否有任何排列是回文,如果是,那么我只是跳出循环并分配发现是真的,但我的问题是面临的是代码不断给出超时错误!现在因为我是 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")

【问题讨论】:

  • 一个“超时错误”是什么? string 有多大(并且 它有任何回文排列)?为什么不在break 之前只使用if found:print 并使用for: else: 构造?

标签: python iterator timeout generator


【解决方案1】:

生成器/迭代器不是这个问题的原因,我假设“超时”意味着它需要太长时间(在 Hacker Rank 上)。问题是处理大量排列所需的时间,即使是中等长度的字符串也能生成。您正在查看阶乘时间复杂度,因为这是给定字符串存在的排列数。

这是另一种不产生任何排列的方法。取而代之的是,该算法仅依赖于这样一个事实,即只有当组成字符串的每个字符的计数为偶数或最多有 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")

【讨论】:

  • 顺便说一句,这通过了黑客等级的权力游戏 - 我的问题没有超时。
【解决方案2】:

这不是生成器的问题。你的算法不是最优的。尝试所有可能的排列并不是检查给定字符集是否可以构建回文的最佳方法。您的算法的复杂度为 O(N!),其增长速度比任何指数复杂度都快,而指数复杂度已经很差了。但是有一个 O(N) 的算法,与字符数成线性关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2020-08-11
    • 2015-11-07
    • 2018-05-16
    • 2018-11-01
    相关资源
    最近更新 更多