前面见过DFS了,现在来刷一道dfs的模板题来体会一下dfs吧
DFS(深度优先搜索)leetcode——46全排列_Soraku7的博客-CSDN博客
17. 电话号码的字母组合
难度中等1899收藏分享切换为英文接收动态反馈
给定一个仅包含数字 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(深度优先算法),这道题算是一道模板题了,不过改变了我们所选择排列的对象,这次我们需要从几个字符串中选择其中的一个字母进行排序。
既然是模板题,我就直接开始coding了。
首先,我们应创建一个手机数字所对应的字母
string map[10] = {"" , "" , "abc" , "def" , "ghi" , "jkl" , "mno" , "pqrs" , "tuv" , "wxyz"};
创建答案字符串数组和当前答案字符串st
vector ans;
string st;
现在开始dfs,代码一句之前的代码模板
void dfs(int now , string digits){
if(st.size() == digits.size()){
ans.push_back(st);
return;
}
for(auto c : map[digits[now] - '0']){
st.push_back(c);
dfs(now + 1, digits);
st.pop_back();
}
}
这里我使用了一点c++11的新的性,用auto遍历数组,当然不熟悉的也可以改成
for(int i = 0 ; i < map[digits[now] - '0'].size() ; i ++)
这样i就定位在了map中的单个字母上了,这里取他的字母
char c = map[digits[now] - '0'][i],然后将c推入st这个字符串中,当我们进行dfs的时候,now会 + 1,因此下一次遍历一定是下一个按键所按的数字所对应的字母串中
现在将代码全部放在下面,有需要的大家可以对照下方代码,希望大家能通过这些模板题,熟悉dfs并且熟练默写。
这里因为输入可能为空,所以多了一个特判.
class Solution {
public:
string map[10] = {"" , "" , "abc" , "def" , "ghi" , "jkl" , "mno" , "pqrs" , "tuv" , "wxyz"};
vector ans;
string st;
void dfs(int now , string digits){
if(st.size() == digits.size()){
ans.push_back(st);
return;
}
for(auto c : map[digits[now] - '0']){
st.push_back(c);
dfs(now + 1, digits);
st.pop_back();
}
}
vector letterCombinations(string digits) {
if(digits.empty()) return ans;
dfs(0 , digits);
return ans;
}
};