获取所有组合,而无需重复
Get all combinations without duplicates
给出字符串的所有可能组合,而无需重复c 。示例输入:" 123"和输出组合是:
1,12,123,13,2,23,3.
重复的示例是" 12" ==" 21"或" 123" ==" 213"。
假设字符不会多次使用。我也不认为递归是强制性的。
这里有一个php答案。(获取所有可能的组合而无需重复(。
我已经考虑过某种形式的结果树,但不确定如何用递归实施。
我的答案包括重复项:
#include <string>
#include <iostream>
using namespace std;
void get( string str, string res ) {
cout << res << endl;
for( int i = 0; i < str.length(); i++ )
get( string(str).erase(i,1), res + str[i] );
}
int main( int argc, char **argv) {
string str = "123";
get( str, "" );
return 0;
}
这是一个采访问题,没有重复的事情使我扔了我。事先感谢您的任何帮助。
OP所寻找的内容等同于电源集减去空集。无需递归即可轻松实现所需的输出。这是一种简单的方法:
#include <vector>
#include <string>
#include <cmath>
#include <iostream>
void GetPowerSet(std::string v) {
std::string emptyString;
std::vector<std::string> powerSet;
int n = (int) std::pow(2.0, (double) v.size()); // Get size of power set of v
powerSet.reserve(n);
powerSet.push_back(emptyString); // add empty set
for (std::string::iterator it = v.begin(); it < v.end(); it++) {
unsigned int tempSize = powerSet.size();
for (std::size_t j = 0; j < tempSize; j++)
powerSet.push_back(powerSet[j] + *it);
}
// remove empty set element
powerSet.erase(powerSet.begin());
// print out results
std::cout << "Here is your output : ";
for (std::vector<std::string>::iterator it = powerSet.begin(); it < powerSet.end(); it++)
std::cout << *it << ' ';
}
int main() {
std::string myStr;
std::cout << "Please enter a string : ";
std::cin >> myStr;
GetPowerSet(myStr);
return 0;
}
这是输出:
Please enter a string : 123
Here is your output : 1 2 12 3 13 23 123
说明:
我们首先要注意,电源集的大小由2^n
给出,其中n
是初始集的大小。出于我们的目的,我们的最终向量仅包含2^n - 1
元素,但是我们仍然需要保留2^n
,以防止调整大小,因为需要"空" 元素来构建我们的结果。
真正的工作是在GetPowerSet
中间的两个for loops
内进行的。我们从一个空白元素开始。然后,我们迭代原始矢量中的每个字符,创建了沿途设置的电源子集。例如
- 用空集的初始化电源集:
powerSet = {}
- 将
v
的第一个元素添加到上述功率集的每个元素:'' + '1' = '1'
。-
powerSet = {{}, '1'}
-
- 将
v
的第二个元素添加到上述功率集的每个元素:'' + '2' = '2', '1' + '2' = '12'
-
powerSet = {{}, '1', '2', '12'}
-
- 将
v
的第三个元素添加到以上功率集的每个元素:'' + '3' = '3', '1' + '3' = '13', '2' + '3' = '23', '12' + '3' = '123'
-
powerSet = {{}, '1', '2', '12', '3', '13', '23', '123'}
-
- 现在删除上面的电源集中的第一个元素。
-
powerSet = {'1', '2', '12', '3', '13', '23', '123'}
-
我们完成了。
以为我会在评论中添加@caninonos的答案。我只是简化了它稍微删除模板等。这是一个递归解决方案。
#include <iostream>
#include <vector>
using namespace std;
void get_substrings_aux(vector<string>& subs, string str ,unsigned int cnt) {
if(cnt == str.size())
return;
int n = subs.size();
char c = str[cnt];
for(int i = 0 ; i < n ; ++i) {
subs.push_back(subs[i] + c);
cout << subs[i] + c << endl;
}
get_substrings_aux(subs, str, ++cnt);
}
vector<string> get_substrings(const string& str) {
vector<string> subs(1);
int cnt=0;
get_substrings_aux(subs, str, cnt);
subs.erase(subs.begin());
return subs;
}
int main() {
string str("1234");
vector<string> subs = get_substrings(str);
return 0;
}
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 使用 next_permutation 获取长度为 N C++的所有组合
- 获取所有组合,而无需重复
- 获取C++中多维数组元素的所有组合
- C++组合从 istream 获取的类对象
- 如何在列表中获取元素的所有组合
- 组合构造函数从成员变量中获取变量
- 从Qt中的组合框中获取串行连接的值
- 如何获取保存对话框组合框值
- 如何获取组合框项目计数
- 如何从从表/模型中获取值的 QML 组合框中访问值
- 获取C++中数字的所有组合
- 获取级联元组类型;组合result_of和tuple_cat
- 如何获取字符串的所有1位或相邻的2位组合
- 如何使用组合键获取boost::multi_index_container中第一个键的不同计数
- 获取datagridview组合框的选定项的索引