Leetcode17电话号码的字母组合(dfs)

前面见过DFS了,现在来刷一道dfs的模板题来体会一下dfs吧

DFS(深度优先搜索)leetcode——46全排列_Soraku7的博客-CSDN博客

17. 电话号码的字母组合

难度中等1899收藏分享切换为英文接收动态反馈

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

Leetcode17电话号码的字母组合(dfs)_第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;
    }
};

你可能感兴趣的:(刷题集,刷题学习,深度优先,leetcode,算法)