我没有发现下面两个函数之间的明显区别。所以问题是,第二个功能如何比较和删除重复的字符。
非重复字符的排列
def perms(s):
if(len(s)==1): return [s]
result=[]
for i,v in enumerate(s):
result += [v+p for p in perms(s[:i]+s[i+1:])]
return result
perms('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
重复字符的排列
def permutations(string):
result = set([string])
if len(string) == 2:
result.add(string[1] + string[0])
elif len(string) > 2:
for i, c in enumerate(string):
for s in permutations(string[:i] + string[i + 1:]):
result.add(c + s)
return list(result)
permutations('aabb');
['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']
修改
当输入包含重复项时,该函数返回不同的结果:
>>> permutations('aabb')
['abab', 'baba', 'bbaa', 'abba', 'aabb', 'baab']
>>> perms('aabb')
['aabb', 'aabb', 'abab', 'abba', 'abab', 'abba', 'aabb', 'aabb', 'abab',
'abba', 'abab', 'abba', 'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa',
'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa']
答案 0 :(得分:2)
区别很简单。第二个函数将结果存储在集合中:
result = set([string])
一组永远不会包含重复项。如果您向集合添加重复值,请注意:
>>> set([1, 2, 3, 2, 3, 2, 1])
set([1, 2, 3])
最后,该函数从集合中创建一个列表,因此从外部看不到该集合:
return list(result)