将c代码移植到actionscript 2

时间:2012-05-02 09:36:17

标签: c flash duplicates port permutation

请看以下链接。 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);           
       }
   }
} 

这可以很好地列出所有具有重复项的排列,但我想删除它们并具有唯一值。到目前为止,我还没有设法从上面的链接移植勾选的解决方案。谢谢你的帮助。

1 个答案:

答案 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可能会出现)来自原始阵列中的不同来源)。

如果要删除生成的数组的重复元素,那么,显然,最好的策略是首先从源中删除它们。