我需要给定字符串的所有可能的排列,这样任何字符都不应该保留在与输入字符串相同的位置。 例如。 :输入“问” 输出:所有可能的permutaions,如“ksa”,“kas”...... 这样'a'不在第一个位置,'s'不在第二个位置,依此类推......在任何排列中。
我只需要计算这种可能的排列
我可以通过生成所有排列并过滤它们来实现这一点,但我需要一种非常有效的方式来实现这一目标。
字符串中的所有字符都是“UNIQUE”
首选语言C ++。
答案 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;
}