2

我试图找到给定字符列表的所有排列,在本例中为“eta”

std::string s="eta";
do
{
    std::cout<<s<<std::endl;

}while(std::next_permutation(s.begin(),s.end()));

我将得到以下输出:

eta
tae
tea

但如果我改变一件事

std::string s="eta";

std::string s="aet";

输出现在变成

aet
ate
eat
eta
tae
tea

这是我期望的正确排列数量;因此,当“加扰”字符串按字母顺序排列时,显然会发生一些不同的事情?

或者这种模棱两可的原因可能是什么?

4

3 回答 3

8

next_permutation按所有排列的排序顺序将序列更改为下一个排列。因此,如果您从不是词典顺序中的第一个排列开始,则在 next_permutation 返回 false 之前,您将仅获得所有排列的一部分。

于 2013-01-03T14:50:22.227 回答
3

正如 izomorphius 指出的那样,下一个排列在最后一个前进的排列上停止。因此,如果您想要所有这些,只需sort字符列表即可。

于 2013-01-03T14:52:47.860 回答
1

next_permutation 将 [first, last) 范围内的元素重新排列为按字典顺序排列的下一个更大的元素排列,

所以你的输出没有问题:)

于 2013-01-03T14:52:09.383 回答