打印字符串 C++` 的所有组合
Printing all combinations of a string C++`
问题:给定一个 string x, sort 然后 打印所有组合。
(在 hackerrank/interviewbit/geeksforgeeks 等编码网站上找到)
这是一个例子...
输入:字符串 x = "BAC"
输出:[ABC、AB、AC、BC、A、B、C]
当前工作解决方案:(仅适用于 x.length() = 3 的情况)
void printCombinations(string q){
stack<char> c;
stack<char> c2;
sort(q.begin(), q.end());
for(int i = 0; i<q.size(); i++){
cout<<q[i];
c.push(q[i]);
}
cout<<endl;
for(int i = 0; i<q.size(); i++){
char t = c.top();
cout<<t<<endl;
for(int j=0; j<c.size(); j++){
c.pop();
c2.push(c.top());
cout<< t << c.top() <<endl;
}
c.pop();
c = c2;
}
}
我不确定为什么您的问题中发布的代码仅适用于 three-character 字符串,但是它存在一些问题(例如,您无需访问堆栈)。
这可以通过将 string
转换为 char
数组并遍历来解决。
可以找到与您所追求的代码类似的代码 here,同一页面还给出了解决方案的名称 (backtracking
) 和一个漂亮的小图表,解释了它如何使用字符串 ABC
举个例子:
(来源:geeksforgeeks.org)
然而,这段代码并没有按照您的意愿执行 'out of the box',但是对代码稍加修改就可以执行:
代码中某处有一个小错误,导致结果输出奇怪的字符,但是 确实 打印出所有组合。
正在研究这个问题,当我有解决方案时会更新代码。
void swap(char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
void permute(char *a, int i, int n)
{
int j;
if (i == n)
std::cout << string(a);
else
{
for (j = i; j <= n; j++)
{
swap((a + i), (a + j));
permute(a, i + 1, n);
swap((a + i), (a + j)); //backtrack
}
}
}
int main()
{
char a[] = "BAC";
int len = sizeof(a) / sizeof(a[0]);
permute(a, 0, len);
getchar();
return 0;
}
void printCombinations(string q){
cout<<"We are now printing out all the combinations of "<<q<<endl;
sort(q.begin(), q.end());
bitset<10> b;
int count =0;
for(int i=0; i<pow(2,q.size()); ++i){
for(int x=0;x<10;x++){
if(b[x] == 1){
cout<<q[x];
}
}
count++;
cout<<endl;
for( int j=0; j<10;j++){
if(b[j]==1){
b[j].flip();
}
else{
b[j].flip();
break;
}
}
}
cout<<"There are "<<count<<" combinations"<<endl;
}
这是上述问题的一种解决方案。
另一种打印给定字符串的所有组合的解决方案。我在代码中给出了注释,解释了每一行的作用。
void combination(int index, string instr, string outstr)
{
for (auto i = index; i < instr.length(); i++)
{
outstr += instr.at(i); // 1: Append a char
cout<<outstr << " "; // 2: Print the current combination
combination(i + 1, instr, outstr); // 3: Recursive call at level i + 1
outstr.erase(outstr.length() - 1, 1); // 4: Balance/Remove the char added at step 1
}
}
int main()
{
combination(0, "ABC","");
return 0;
}
输出:
A AB ABC AC B BC C
问题:给定一个 string x, sort 然后 打印所有组合。 (在 hackerrank/interviewbit/geeksforgeeks 等编码网站上找到)
这是一个例子...
输入:字符串 x = "BAC"
输出:[ABC、AB、AC、BC、A、B、C]
当前工作解决方案:(仅适用于 x.length() = 3 的情况)
void printCombinations(string q){
stack<char> c;
stack<char> c2;
sort(q.begin(), q.end());
for(int i = 0; i<q.size(); i++){
cout<<q[i];
c.push(q[i]);
}
cout<<endl;
for(int i = 0; i<q.size(); i++){
char t = c.top();
cout<<t<<endl;
for(int j=0; j<c.size(); j++){
c.pop();
c2.push(c.top());
cout<< t << c.top() <<endl;
}
c.pop();
c = c2;
}
}
我不确定为什么您的问题中发布的代码仅适用于 three-character 字符串,但是它存在一些问题(例如,您无需访问堆栈)。
这可以通过将 string
转换为 char
数组并遍历来解决。
可以找到与您所追求的代码类似的代码 here,同一页面还给出了解决方案的名称 (backtracking
) 和一个漂亮的小图表,解释了它如何使用字符串 ABC
举个例子:
(来源:geeksforgeeks.org)
然而,这段代码并没有按照您的意愿执行 'out of the box',但是对代码稍加修改就可以执行:
代码中某处有一个小错误,导致结果输出奇怪的字符,但是 确实 打印出所有组合。 正在研究这个问题,当我有解决方案时会更新代码。
void swap(char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
void permute(char *a, int i, int n)
{
int j;
if (i == n)
std::cout << string(a);
else
{
for (j = i; j <= n; j++)
{
swap((a + i), (a + j));
permute(a, i + 1, n);
swap((a + i), (a + j)); //backtrack
}
}
}
int main()
{
char a[] = "BAC";
int len = sizeof(a) / sizeof(a[0]);
permute(a, 0, len);
getchar();
return 0;
}
void printCombinations(string q){
cout<<"We are now printing out all the combinations of "<<q<<endl;
sort(q.begin(), q.end());
bitset<10> b;
int count =0;
for(int i=0; i<pow(2,q.size()); ++i){
for(int x=0;x<10;x++){
if(b[x] == 1){
cout<<q[x];
}
}
count++;
cout<<endl;
for( int j=0; j<10;j++){
if(b[j]==1){
b[j].flip();
}
else{
b[j].flip();
break;
}
}
}
cout<<"There are "<<count<<" combinations"<<endl;
}
这是上述问题的一种解决方案。
另一种打印给定字符串的所有组合的解决方案。我在代码中给出了注释,解释了每一行的作用。
void combination(int index, string instr, string outstr)
{
for (auto i = index; i < instr.length(); i++)
{
outstr += instr.at(i); // 1: Append a char
cout<<outstr << " "; // 2: Print the current combination
combination(i + 1, instr, outstr); // 3: Recursive call at level i + 1
outstr.erase(outstr.length() - 1, 1); // 4: Balance/Remove the char added at step 1
}
}
int main()
{
combination(0, "ABC","");
return 0;
}
输出:
A AB ABC AC B BC C