当相应字符不在同一位置时,字符串的所有排列

All Permutations of a string when corresponding characters are not in the same place

本文关键字:字符串 排列 位置 字符      更新时间:2023-10-16

我需要给定字符串的所有可能排列,因此任何字符不应与输入字符串中的位置保持在同一位置。例如。:对于输入"问"输出:所有可能的排列,例如" KSA"," KAS" ...使得" A"不在第一个位置," S"不在第二个位置,等等...在任何置换中。

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

我可以通过生成所有排列并过滤它们来做到这一点,但是我需要一个非常有效的这样做的方法。

字符串中的所有字符均为"唯一"

首选语言C 。

您要寻找的被称为扰动 - Wikipedia文章对获得公式的一种方法有很好的解释,以及结果的几个不同方程式。<<<<<<<<<</p>

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

对于一组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;
}