在Java中查找2个数组是否是递归的相互排列

时间:2016-01-06 18:31:40

标签: java arrays recursion permutation

如果数组true是数组ab的排列,我需要构建一个返回false的递归函数。

public static boolean isPermutation (int [] a, int [] b) 
  • 可以为函数添加参数。
  • 不能使用本地数组。
  • 不能使用循环。
  • 不能使用库函数。
  • 无法更改数组。

有没有人有想法?

2 个答案:

答案 0 :(得分:2)

这应该对你有用,它基本上是一个用递归实现的循环。这应该在二次时间内执行。

public static boolean isPermutation(int[] a, int[] b, boolean[] ataken, boolean[] btaken, int iter, int totalTaken, int aidx, int bidx)
{
    if (a.length != b.length) return false;

    // totalTaken is a count of the number of matches we've "taken"
    if(totalTaken == a.length) return true;

    // don't "loop" b
    if(bidx >= b.length)
    {
        return false;
    }

    // we should loop through a... this will yield a quadratic runtime speed
    if(aidx >= a.length)
    {
        if (iter < a.length)
        {
            return isPermutation(a, b, ataken, btaken, iter + 1, totalTaken, 0, bidx);
        }

        // finished our loop, and "totalTaken" wasn't the whole array
        return false;
    }

    // found a match for this b[bidx]
    if(a[aidx] == b[bidx] && !ataken[aidx] && !btaken[bidx])
    {
        ataken[aidx] = true;
        btaken[bidx] = true;
        return isPermutation(a, b, ataken, btaken, iter, totalTaken + 1, aidx + 1, bidx + 1);
    }

    // loop through a
    return isPermutation(a, b, ataken, btaken, iter, totalTaken, aidx + 1, bidx);
}

您可以使用atakenbtaken数组填充false,但其长度分别与ab相同。

var isPerm = staticClassName.isPermutation(a, b, ataken, btaken, 0, 0, 0, 0);

答案 1 :(得分:-1)

这个想法如下:如果a中所有成员的产品等于b中所有成员的产品以及a中所有成员的总和,那么这是一种排列等于b中所有成员的总和。

编写一个递归辅助函数,它允许您计算这些总和和产品并进行比较。

复杂性:O(n)

警告:如果处理许多大数字可能会溢出

请参阅评论,了解John Carpenter提出的重要观点