字符串的所有排列,当相应的字符不在同一个地方时

时间:2012-11-03 09:33:23

标签: c++ c string algorithm permutation

我需要给定字符串的所有可能的排列,这样任何字符都不应该保留在与输入字符串相同的位置。 例如。 :输入“问” 输出:所有可能的permutaions,如“ksa”,“kas”...... 这样'a'不在第一个位置,'s'不在第二个位置,依此类推......在任何排列中。

我只需要计算这种可能的排列

我可以通过生成所有排列并过滤它们来实现这一点,但我需要一种非常有效的方式来实现这一目标。

字符串中的所有字符都是“UNIQUE”

首选语言C ++。

2 个答案:

答案 0 :(得分:4)

你正在寻找的东西被称为紊乱 - Wikipedia article对获得公式的一种方法有很好的解释,以及结果的几个不同的方程式。

您还可以使用包含原则计算数字,从所有排列的数量开始 - n !,然后用固定在其位置的一个数字减去排列,添加两个数字固定的排列,依此类推。

答案 1 :(得分:-1)

对于一组n可区分的元素,您可以排列它们,而dearangements(n)方式中没有任何元素位于其原始位置:

int derangements(int n) {
    assert(n >= 0);
    return n ? ((n - 1) * (derangements(n - 1) + derangements(n - 2)) : 1;
}

请注意,由于非线性递归,它具有指数运行时。但是你可以改进这个公式。

int derangements(int n) {
    assert(n >= 0);
    if(n == 0) return 1;

    int a = 1;
    int b = 0;
    do {
       int x = (n-1)*(a+b);
       a = b;
       b = x;
    } while(--n > 1);
    return b;
}