函数 select 来自 c++ 字符串的字符组合

function to select combinations of characters from a string in c++

所以这是我的问题:

我需要一个函数,给定一个随机长度的字符串 "qwer" 可以 select 并将所有可能的字符序列放入一个数组中,长度从 1 到字符串的长度。 对不起,很难解释,但我认为用一个例子应该更容易理解。因此,如果我有字符串 "qwer",我想要一个函数来创建包含以下条目的数组:

qwer qwe 水 qwr qer qw qe qr 我们 写 呃 q w 电子 r

请注意,在超过一个字符的项目中,字符的顺序必须遵循原始字符串的顺序(例如,我想要项目 qwe,但我不想要同上的 ewq)。因此,这不仅仅是排列的问题,而是尊重原始顺序的排列问题。

此外,正如我在开头所说,理想情况下该函数应该能够处理任何长度的字符串。

你知道这样的功能是否存在吗? 或者您对如何创建它有任何想法吗?我有点卡住了..

这是一种方法。

  1. 为每个字母关联 0 或 1。 0 表示不包含,1 表示包含。
  2. 编写将(二进制)数字映射到字符串的函数。例如,0111 将映射到 wer
  3. 构建代码以计算从 0 到停止条件(1111,即您的情况下为 15)的整数。将这些整数映射到二进制,然后应用 (2).

正如Bathsheba所说,我们需要用比特来代替字符。然后迭代位可能产生的所有可能值。我的示例仅适用于长度小于 31 的短字符串。如果您需要更多,请使用 std::bitset 容器。

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> f(const std::string & str)
{
    const int length = str.length();
    const int bits = 1 << length;

    std::vector<std::string> result;
    for (int i = 1; i < bits; ++i)
    {
        std::string combined_string;
        for (int bit = 0; bit < length; ++bit)
        {
            if (i & (1<< bit))
            {
                combined_string += str[bit];
            }
        }
        result.push_back(combined_string);
    }

    return result;
}

void main()
{
    for (auto str : f("qwer"))
    {
       std::cout << str << " ";
    }
    std::cout << std::endl;
}