当相应字符不在同一位置时,字符串的所有排列
All Permutations of a string when corresponding characters are not in the same place
我需要给定字符串的所有可能排列,因此任何字符不应与输入字符串中的位置保持在同一位置。例如。:对于输入"问"输出:所有可能的排列,例如" 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;
}
相关文章:
- 找到具有最多子串栅栏的字符串排列
- 为什么我得到长度仅为 3 的字符串排列的输出?
- 如何排列二进制字符串以最小化它们之间的距离
- C++按字母顺序排列的字符串数组
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何在 c++ 中按字母顺序排列数组中的字符串?
- 在c++中生成字符串的排列
- 从给定字符串中查找长度 k 的所有排列/组合
- C++ 字符串的排列,输出的结果小于或等于字符串的长度
- 生成具有条件的给定字符串的排列
- 从左到右打印字符串的组合(不是排列)c++
- 如何找到通过仅移动相邻字符创建的字符串的排列?-C++
- 如何在C++中分隔和排列名字和全名字符串
- 如何从长度为 n 的字符串中获取 lengh k 的所有唯一排列的数量
- 它如何排列单词以使用 qsort 和字符串
- 非递归二进制字符串排列生成器
- 生成没有重复项的字符串排列
- 字符串排列:如何去除重复排列
- 什么是可以高效打印字符串排列的算法?
- 字符串排列