<p>这是创建具有重复元素的集合排列的标准方法:计算每个元素的出现次数(例如,使用关联数组或字典),循环字典中的元素,每次将元素追加到排列中,并与字典的其余部分一起递归。不过,对于很长的输入数组,它永远不会很快;但是,很可能什么都不会。在</p>
<p><i>(JavaScript中的代码示例;我不会说Python;翻译应该很容易。)</i></p>
<p/><div^{cl1}$&13;
<div^{cl2}$&13;
<pre class="snippet-code-js lang-js prettyprint-override"><code>function permute(set) {
var alphabet = {};
for (var s in set) {
if (!alphabet[set[s]]) alphabet[set[s]] = 1;
else ++alphabet[set[s]];
} // alphabet = {'a':5, 'b':2, 'r':2, 'c':1, 'd':1}
perm("", set.length);
function perm(part, level) {
for (var a in alphabet) { // every letter in alphabet
if (alphabet[a]) { // one or more of this letter available
alphabet[a]; // decrement letter count
if (level > 1) perm(part + a, level - 1); // recurse with rest
else document.write(part + a + "<br>"); // deepest recursion level
++alphabet[a]; // restore letter count
}
}
}
}
permute(['a','b','r','a','c','a','d','a','b','r','a']); // 83,160 unique permutations
// instead of 39,916,800 non-
// unique ones plus filtering</code></pre>
;
</div>和13;
</div>和13;