给定一个数字字符串,我们需要打印数字代表的所有字母组合
对于输入“23”,输出应为[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]。
class Solution {
public:
char ph[10][4]={{'0','0','0','0',},{'0','0','0','0',},{'a','b','c','0'},{'d','e','f','0'},{'g','h','i','0'},{'j','k','l','0'},{'m','n','o','0'},{'p','q','r','s'},{'t','u','v','0'},{'w','x','y','z'}};
vector<string> ans;
void print(string digits,string st,int pos)
{
int i,l=digits.size();
if(l==pos)
{
ans.push_back(st);
return;
}
else
{
for(i=pos;i<l;i++)
{
int ch=digits[i]-'0';
for(int j=0;j<4 && ph[ch][j]!='0';j++)
{
print(digits,st+ph[ch][j],i+1);
}
}
}
}
vector<string> letterCombinations(string digits) {
int l=digits.size();
if(!l)
return ans;
print(digits,"",0);
return ans;
}
};
但输入“22”时出现错误,另外打印'a','b',c'。代码有什么问题?
答案 0 :(得分:1)
问题是你们都在循环和递归。
print("22", "", 0);
将进入
print("22", "a", 1);
print("22", "b", 1);
print("22", "c", 1);
print("22", "a", 2);
print("22", "b", 2);
print("22", "c", 2);
你的额外位是最后三次调用。
摆脱输入数字的循环(你已经通过递归执行了这一步):
void print(string digits, string st, int pos)
{
if(digits.size() == pos)
{
ans.push_back(st);
}
else
{
int ch = digits[pos] - '0';
for(int j = 0; j < 4 && ph[ch][j] != '0'; j++)
{
print(digits, st + ph[ch][j], pos + 1);
}
}
}
(你也忘了终止你的一些阵列,但这是一个不同的问题。)