题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
0 <= digits.length <= 4
digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
概述
这是一道dfs的题目
首先为什么他是一道dfs的题目?
dfs是一个遍历的方式,该题就是按键映射的字母的排列组合,所以这道题就是一道dfs的题目
怎么处理dfs的题目?
对于dfs的题目处理方式:
1.写出终止条件
2.候选节点的筛选
3.回溯
代码
class Solution {
public:
string temp;
// 注意审题,前面两个用不到,所以置为空串
vector<string> board = {"", "", "abc", "def", "ghi","jkl","mno","pqrs","tuv","wxyz"};
// 用来存放结果的空串
vector<string> ans;
void dfs(int pos,string digits){
//1. 终止条件
if(pos==digits.size()){
ans.push_back(temp);
return;
}
// 候选节点的筛选
// 表示键盘按到了第几个键
int nums=digits[pos]-'0';
for(int i=0;i<board[nums].size();i++){
temp.push_back(board[nums][i]);
dfs(pos+1,digits);
temp.pop_back();//回溯
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0){
return {};
}
dfs(0,digits);
return ans;
}
};
代码解释
参数 digits 表示输入的数字序列。
代码首先处理边界条件,即如果输入的数字序列长度为 0,直接返回一个空的向量。
然后调用 dfs 函数来进行深度优先遍历,获取结果。
在 dfs 函数中,采用递归的方式实现深度优先遍历。该函数接受两个参数,一个是要处理的输入数字序列,另一个是当前的层数。在初始调用时,层数为 0,可以理解为第一层,即选取第一个数字对应的字符;第二层则是选取第二个数字对应的字符,依此类推。
在函数内部,递归的终止条件是根据数字序列的长度来确定的,即 pos == digits.size(),表示遍历结束。
每次递归调用时,函数会选取当前位置的数字,并遍历该数字对应的字符集合,将选取的字符与后续字符进行组合。然后,将组合结果与当前字符拼接,形成新的组合。这样,通过递归调用和不断拼接字符,就可以得到所有可能的组合。
在递归结束后,为了避免 temp 影响到后续的遍历,需要进行回溯操作,即将最后一个字符从 temp 中移除。
最后,通过使用 return 关键字来结束递归。
希望以上总结对你有帮助,如果有任何进一步的问题,请随时提问。