问题 - 给定一个字符串'0','1'和'?'。生成所有可能的字符串,您可以替换'?' '0'或'1'?
例如 - 输入 - “0 ??” 输出 - “000”,“001”,“010”,“011”。
我为它写了一个简单的程序 -
void gen(string& str, int index)
{
int i;
if(str.length() == index)
{
cout << str << endl;
return;
}
else
{
for(i=index; str[i]!='\0' && str[i]!='?';i++);
if(str[i] == '?')
{
str[i] ='0';
gen(str,i+1);
str[i] ='1';
gen(str,i+1);
}
}
return;
}
int main()
{
string s ="0??";
gen(s, 0);
return 0;
}
它无法正常工作.... 如果您将void gen(String&amp;,int)中的论据替换为
void gen(String,int)....
然后它将正常工作..
任何人都可以解释我......
答案 0 :(得分:1)
引用将保持函数调用中更改的值
after set str[1] ='0';
sub call: gen(str,2); will output combination: 000 001
reset str[1] ='1';
str is still 011
gen(str,i+1); output nothing
希望这段代码可以提供帮助
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
void gen(string& str, int index)
{
int i;
if(str.length() == index)
{
cout << str << endl;
return;
}
else
{
for(i=index; str[i]!='\0' && str[i]!='?';i++);
if(str[i] == '?')
{
printf("before set pos %d to 0: %s\n",i,str.c_str());
str[i] ='0';
printf("after set pos %d to 0: %s\n",i,str.c_str());
gen(str,i+1);
printf("before set pos %d to 1: %s\n",i,str.c_str());
str[i] ='1';
printf("after set pos %d to 1: %s\n",i,str.c_str());
gen(str,i+1);
}
}
return;
}
int main()
{
string s ="0??";
gen(s, 0);
return 0;
}
输出:
答案 1 :(得分:1)
当您通过引用传递字符串时,所有递归gen()
的调用都会运行一个字符串 - 而不是每次调用gen()
在自己的本地副本上工作。每次递归调用gen()
都会修改(共享)字符串,删除所有“?”字符;当那个电话回来时,没有更多'?'剩下要处理的字符,所以它只是终止。
当您通过值传递字符串时,gen()
函数的每次调用都会获得自己的字符串本地副本;当函数返回上一级时,它对该字符串所做的任何更改都会被丢弃并被遗忘。在这种情况下,你的逻辑是正确的。
(还有一个错误导致它在我的Windows机器上崩溃,直到我修复它:std::string
不是空终止的,所以不应该检查std[i] == '\0'
你应该做i < str.length()
之类的事情{1}}。)
答案 2 :(得分:0)
一个简单的解决方案是:
每个'?'应该用0和1替换,我们可以看到字符串中有'2 **(数量?)'这样的可能替换。例如,如果我们有三个'?'在字符串中将有8个这样的可能替换,如果我们考虑它们的数值,它们将是0,1,2 ...,7并且其二进制表示将是000,001,002,....,111。基本上我们应该取数值并用数值中的位替换'?'。