void permute(string elems, int mid, int end)
{
static int count;
if (mid == end) {
cout << ++count << " : " << elems << endl;
return ;
}
else {
for (int i = mid; i <= end; i++) {
swap(elems, mid, i);
permute(elems, mid + 1, end);
swap(elems, mid, i);
}
}
}
上面的函数显示了排列str
(with str[0..mid-1]
作为稳定的前缀,并且str[mid..end]
作为可替换后缀)。所以我们可以使用permute(str, 0, str.size() - 1)
显示一个字符串的所有排列。
但该函数使用了递归算法;也许它的性能可以提高?
有没有更好的方法来排列字符串?
这是来自维基百科条目的 C++ 中的非递归算法排列的无序生成。对于字符串s
长度n
,对于任何k
from 0
to n! - 1
包含在内,以下修改s
提供唯一的排列(即,不同于为该范围内任何其他 k 值生成的排列)。要生成所有排列,请对所有 n! 运行它。k
s 的原始值的值。
#include <algorithm>
void permutation(int k, string &s)
{
for(int j = 1; j < s.size(); ++j)
{
std::swap(s[k % (j + 1)], s[j]);
k = k / (j + 1);
}
}
Here swap(s, i, j)
交换字符串 s 的位置 i 和 j。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)