注意因为有函数调用问题,前三行是定义在全局的,剩下的看代码注释吧……回溯有点乱
class Solution {
public:
string tmp; //存储临时字母
vector<string> board = {"", "", "abc", "def", "ghi","jkl","mno","pqrs","tuv","wxyz"}; //0-9按键包含的字母
vector<string> ans; //存储叶子节点
// 以上定义在全局
vector<string> letterCombinations(string digits) {
if(digits.size()==0){
return {};
}
dfs(0,digits);
return ans;
}
void dfs(int pos, string digits){ // 回溯函数 pos代表第几个按键
if(pos == digits.size()){
ans.push_back(tmp);
// 当pos=digits长度时代表一个字母组合已结束,则push进ans
return;
}
int num = digits[pos] - '0'; //表示按到了键盘上的第几个键
for(int i = 0; i < board[num].size(); i ++){
tmp.push_back(board[num][i]);
dfs(pos + 1, digits); //递归下一层
tmp.pop_back();
//上一行递归完成后代表一个完整的字符组合已经被push进ans
//此时要pop出最上面的临时字符变量以进行下一次
}
}
};