请看以下链接。 Permutation of String letters: How to remove repeated permutations?
我想把它移植到actionscript 2.这是我到目前为止所拥有的:
var str:String = "AAC";
var arr:Array = str.split("");
permute(0,2);
function swap(i:Number, j:Number)
{
var temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function permute(i:Number, n:Number)
{
var k:Number;
if (i == n)
trace(arr);
else
{
for (k = i; k <= n; k++)
{
swap(i, k);
permute(i+1, n);
swap(i, k);
}
}
}
这可以很好地列出所有具有重复项的排列,但我想删除它们并具有唯一值。到目前为止,我还没有设法从上面的链接移植勾选的解决方案。谢谢你的帮助。
答案 0 :(得分:0)
以下是两个版本,第一个是AS3,第二个是AS2。这是一个稍微不同的算法(它比你拥有的算法效率低一点,但我认为它会做一个例子)。它本质上是相同的算法复杂度,所以没关系,冗余是生成中间结果(更短的数组),后来被丢弃(但你可以修改它以重用那些数组,如果这涉及到你)。
AS3
private function permuteRecursively(input:Array,
hash:Object = null):Array
{
var first:String;
var oldResult:Array;
var newResult:Array;
var times:int;
var current:Array;
var test:String;
if (input.length > 1)
{
first = input.shift();
if (!hash) hash = { };
oldResult = this.permuteRecursively(input, hash);
newResult = [];
for each (var result:Array in oldResult)
{
times = result.length;
while (times >= 0)
{
current = result.concat();
if (times == result.length) current.push(first);
else current.splice(times, 0, first);
test = current.join("");
if (!(test in hash))
{
newResult.push(current);
hash[test] = 1;
}
times--;
}
}
}
else newResult = [input];
return newResult;
}
AS2:
private function permuteRecursively(input:Array,
hash:Object):Array
{
var first:String;
var oldResult:Array;
var newResult:Array;
var times:Number;
var current:Array;
var test:String;
var result:Array;
if (input.length > 1)
{
first = input.shift();
if (!hash) hash = { };
oldResult = this.permuteRecursively(input, hash);
newResult = [];
for (var i:Number = 0; i < oldResult.length; i++)
{
result = oldResult[i];
times = result.length;
while (times >= 0)
{
current = result.concat();
if (times == result.length) current.push(first);
else current.splice(times, 0, first);
test = current.join("");
if (!(test in hash))
{
newResult.push(current);
hash[test] = 1;
}
times--;
}
}
}
else newResult = [input];
return newResult;
}
修改强>
实际上,现在我想起来了,我不确定你试图避免什么样的副本。上面的代码将AAC的排列(例如AAC和ACA)视为不同(即使A在其中“重复”),但AAC和AAC被认为是相同的(即使第一个A和第二个A可能会出现)来自原始阵列中的不同来源)。
如果要删除生成的数组的重复元素,那么,显然,最好的策略是首先从源中删除它们。