C ++一组字符串的所有排列

示踪剂

我试图生成向量中字符串的所有排列。例如,对于

vector<string> vs = { "a", "b", "c"}; 

我写了以下代码:

do{
    for (string s : vs)
        cout << s << " ";
    cout << endl;
} while (std::next_permutation(vs.begin(), vs.end()));

我的输出是:

abc
acb
bac
bca
cab
cba

但是,我缺少像这样的组合

一个
AB
BA
C ^

等等..

我想修改我的代码,使其也包括这些安排。怎么做?谢谢!

马克斯·兰霍夫

您的示例表明,您不仅要输出输入的每个子集(幂集),而且还要输出每个集的所有排列。

我不知道用于此目的的特定术语,但是OEIS A000522称这些为“安排”。

要获得所需的内容,您必须将代码与Jarod的部分答案(或您可以在此处找到的任何其他电源设置实现)结合起来:

void outputAllPermutations(std::vector<std::string> input)
{
    // assert(std::is_sorted(input.begin(), input.end()));
    do
    {
        for (std::string s : input)
            std::cout << s << " ";
        std::cout << std::endl;
    } while (std::next_permutation(input.begin(), input.end()));
}

bool isBitSet(unsigned bitset, std::size_t i)
{
    return (bitset & (1 << i)) != 0;
}

void outputAllArrangements(const std::vector<std::string>& input)
{
    // assert(std::is_sorted(input.begin(), input.end()));
    // assert(input.size() < std::sizeof(unsigned) * 8);

    unsigned bitset = 0;

    std::vector<std::string> subset{};
    subset.reserve(input.size());

    for (unsigned bitset = 0; bitset < (1 << input.size()); ++bitset)
    {
        subset.clear();
        for (std::size_t i = 0; i != input.size(); ++i)
            if (isBitSet(bitset, i))
                subset.push_back(input[i]);

        outputAllPermutations(subset);
    }
}

演示包括示例输出

我使用unsigned而不是,std::vector<bool>因为我发现总体增量逻辑更容易以这种方式进行推理。从理论上讲,这会将代码“限制”到小于32个字符串(或64个字符串,具体取决于平台)的输入,但是看到输入长度22已经花费了数千年的时间,而每个输出1个CPU周期的输出我对此感到满意。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将一组字符串转换为简单的字符串C ++

可以由一组n个字符组成的所有长度为k的字符串

字符串中的字符与C中的一组字符的比较

如何在C ++中获得一组字符串中最长的字符串

正则表达式-从字符串中检索所有大写字符,分成一组

C#:如何仅从字符串中返回第一组大写字母单词?

输出一组字符串的所有值

在类或结构中使用一组字符串常量,并将其用作方法C#的参数

C-获取字符串的所有排列,并为每个重复的字符分配一个数字

PostgreSQL:从一组字符生成所有可能的任意长度的字符串

正则表达式(ruby)删除一组字符的所有实例(字符串开头除外)

c#删除所有包装字符串的div

c ++ Bank项目;如何将一组字符串读为单个浮点并将其添加

从字符串C#解析所有双打

在C ++中将一组整数读取为字符串

字符串匹配/与Mysql 5.0 / C#/ LINQ中具有不同**组合**的另一组字符串进行比较

无法从一组字符串中取出一个数字-C

使用C#中的一组随机生成的字符串值评估用户的输入

C#:用于存储项目中所需的一组字符串值的最佳结构?

替换在字符串 c# 中找到的第一组引号中的内容

在字符串 C# 类文件 (.cs) 中查找一组字符

C# 获取一个单词在长字符串中所有出现的所有内容

c#如何获取对象列表及其频率的所有唯一组合

C# 置换一组给定 n 并给定最大数组长度的字符串

从两个字符串中获取所有唯一组合 c#

除了一组子字符串之外,如何替换字符串中的所有内容?

查找在 C+++ 中拆分字符串的所有数组排列

在 c# 中,如何生成一组字符串,如 aa0000 > aa0001 >... > zz9999

使用列表将所有字符映射到 R 中字符串的另一组字符