【问题标题】:next_permutation returning strange resultsnext_permutation 返回奇怪的结果
【发布时间】:2026-02-07 12:30:02
【问题描述】:

我正在尝试查找给定字符列表的所有排列,在本例中为“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

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

或者是什么原因导致了这种歧义?

【问题讨论】:

  • 在第一行之后添加std::sort(s.begin(), s.end());

标签: c++ stl permutation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】: