函数 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)。因此,这不仅仅是排列的问题,而是尊重原始顺序的排列问题。
此外,正如我在开头所说,理想情况下该函数应该能够处理任何长度的字符串。
你知道这样的功能是否存在吗?
或者您对如何创建它有任何想法吗?我有点卡住了..
这是一种方法。
- 为每个字母关联 0 或 1。 0 表示不包含,1 表示包含。
- 编写将(二进制)数字映射到字符串的函数。例如,
0111
将映射到 wer
。
- 构建代码以计算从 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;
}
所以这是我的问题:
我需要一个函数,给定一个随机长度的字符串 "qwer" 可以 select 并将所有可能的字符序列放入一个数组中,长度从 1 到字符串的长度。 对不起,很难解释,但我认为用一个例子应该更容易理解。因此,如果我有字符串 "qwer",我想要一个函数来创建包含以下条目的数组:
qwer qwe 水 qwr qer qw qe qr 我们 写 呃 q w 电子 r
请注意,在超过一个字符的项目中,字符的顺序必须遵循原始字符串的顺序(例如,我想要项目 qwe,但我不想要同上的 ewq)。因此,这不仅仅是排列的问题,而是尊重原始顺序的排列问题。
此外,正如我在开头所说,理想情况下该函数应该能够处理任何长度的字符串。
你知道这样的功能是否存在吗? 或者您对如何创建它有任何想法吗?我有点卡住了..
这是一种方法。
- 为每个字母关联 0 或 1。 0 表示不包含,1 表示包含。
- 编写将(二进制)数字映射到字符串的函数。例如,
0111
将映射到wer
。 - 构建代码以计算从 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;
}