天真的方法:对列表的克隆进行排序,然后将原始列表与排序后的克隆进行比较。如果相等,则有一个置换。但排序需要时间。
我试图创建一个函数isPerm(P)
,如果它是置换,则返回True
,否则返回False
。
到目前为止,我有:
def isPerm(P):
if len(P) == list(range(P)):
return True
else:
return False
任何帮助都会很棒。
我能想到的最简单的方法是使用Counter
from collections import Counter
def isPerm(P, Q):
return Counter(P) == Counter(Q)
print isPerm("oolegg", "google")
输出
True
对于短列表来说,这是一个简单的解决方案。
def is_perm(a, b):
return sorted(a) == sorted(b)
高效的方法:创建一个条目设置为0的字典/计数器,并在列表中循环,增加字典中的值。如果在完成列表后得到0
或大于1的值,则没有排列。