- 我怎么也没想到,他还能打一样的。
-
- 输入的数字的顺序能变,开始在dfs循环时,i总是从0开始;
- 输入的数字的顺序不能变,开始在dfs循环时,i要从自己设定的一个变量p开始。比如输入2,3。当我们循环到 3 ,_时,由于不能从0开始循环,所以2填不进去。
当事人考虑到了2,写的错误代码:(主要思想还是填坑)
int flag_num[200]={0};
int flag_char[200]={0};
vector<string> letterCombinations(string digits) {
vector<string> ans;
if(digits.empty()) return ans;
string tep;
string mapp[12];
mapp[2]="abc";
mapp[3]="def";
mapp[4]="ghi";
mapp[5]="jkl";
mapp[6]="mno";
mapp[7]="pqrs";
mapp[8]="tuv";
mapp[9]="wxyz";
dfs(digits,ans,0,tep,mapp,0);
return ans;
}
void dfs(string digits,vector<string>& ans,int n,string tep,string* mapp,int p){
if(n>=digits.size()){
ans.push_back(tep);
return;
}
for(int i=p;i<digits.size();i++){
if(flag_num[digits[i]-'0']==0){
flag_num[digits[i]-'0']=1;
for(int j=0;j<mapp[digits[i]-'0'].size();j++){
if(flag_char[mapp[digits[i]-'0'][j]]==0){
flag_char[mapp[digits[i]-'0'][j]]=1;
tep.push_back(mapp[digits[i]-'0'][j]);
dfs(digits,ans,n+1,tep,mapp,p+1);
tep.pop_back();
flag_char[mapp[digits[i]-'0'][j]]=0;
}
}
flag_num[digits[i]-'0']=0;
}
}
}
这个题和之前自己想的有点不一样。
一个是有后效性(比如 n的全排列问题),一个没有(本题)。
从图上看,一个是分支不断减少,另一个是分支同等。
上面的是自己写出来的(所以程序也要模拟这个过程),下面的是客观存在的。
改变自己错误的代码,把一个循环换成了函数参数,同时把flag去掉了。
因为从图上看,这不就成了遍历一棵满n叉树了吗?遍历一棵树还需要标记走过了吗?
vector<string> letterCombinations(string digits)
{
vector<string> ans;
if(digits.empty()) return ans;
string tep;
string mapp[12];
mapp[2]="abc";
mapp[3]="def";
mapp[4]="ghi";
mapp[5]="jkl";
mapp[6]="mno";
mapp[7]="pqrs";
mapp[8]="tuv";
mapp[9]="wxyz";
dfs(digits,ans,0,tep,mapp,0);
return ans;
}
void dfs(string digits,vector<string>& ans,int n,string tep,string* mapp,int i)
{//这里i是第几个数字
if(n>=digits.size())
{
ans.push_back(tep);
return;
}
for(int j=0; j<mapp[digits[i]-'0'].size(); j++)//数字i里面有几个字母
{
tep.push_back(mapp[digits[i]-'0'][j]);
dfs(digits,ans,n+1,tep,mapp,n+1);
tep.pop_back();
}
}