You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似std::next_permutation且无需用完字符串所有字符的排列组合?

问题解答

C++标准库没有提供直接实现该需求的内置方法,你可以结合现有标准库的next_permutation和位掩码枚举的方式快速实现。

实现思路

  • 枚举所有非空的字符选择状态:用位掩码标记当前选中原字符串中的哪些字符,覆盖所有长度1到原字符串长度的选择场景
  • 对每个选中的字符子集,生成全排列后存入结果
  • 额外去重避免原字符串存在重复字符时生成重复结果

参考实现代码

#include <string>
#include <vector>
#include <algorithm>
#include <set>

void get_all_permutations(std::string s, std::vector<std::string>& res) {
    int n = s.size();
    std::set<std::string> unique_res; // 自动去重

    // 枚举所有非空子集
    for (int mask = 1; mask < (1 << n); ++mask) {
        std::string cur;
        for (int i = 0; i < n; ++i) {
            if (mask & (1 << i)) {
                cur.push_back(s[i]);
            }
        }
        // 对当前子集生成全排列
        std::sort(cur.begin(), cur.end());
        do {
            unique_res.insert(cur);
        } while (std::next_permutation(cur.begin(), cur.end()));
    }

    // 转存到结果vector
    res.assign(unique_res.begin(), unique_res.end());
}

代码说明

  • 位掩码mask的每一位对应原字符串的一个字符是否被选中,自动覆盖所有长度的子集
  • 用std::set自动去重,即使原输入有重复字符,也不会输出重复的排列
  • 如果你确定输入字符串没有重复字符,也可以去掉set直接往vector里写入数据,性能会更高
  • 如果输入字符串长度大于16,把mask的类型换成uint32_t即可,长度大于32则换成uint64_t

内容的提问来源于stack exchange,提问作者Enz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:36:03