欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

17. 电话号码的字母组合

程序员文章站 2022-04-16 23:53:02
...

17. 电话号码的字母组合

1.题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
17. 电话号码的字母组合
示例:
17. 电话号码的字母组合
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

2.思路

当给定了输入字符串,比如:“23”,那么整棵树就构建完成了,如下:
17. 电话号码的字母组合
问题转化成了从根节点到空节点一共有多少条路径;

3.代码

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> res;
        if(digits.empty()){
            return res;
        }
        string str;
        findCombinations(digits,0,str,res);
        return res;
    }
    void findCombinations(string& digits,int i,string& str, vector<string>& res){
        if(i == digits.size()){
            res.push_back(str);
            return;
        }
        char digit = digits[i];//选择第i个数字
        string letters = digits_map[digit-'0'];
        for(auto &w : letters){
            str += w;
            findCombinations(digits, i+1,str,res);
            str.pop_back();
        }
        return;
    }
private:
    vector<string> digits_map = {
            " ",    //0
            "",     //1
            "abc",  //2
            "def",  //3
            "ghi",  //4
            "jkl",  //5
            "mno",  //6
            "pqrs", //7
            "tuv",  //8
            "wxyz"  //9
    };
};

4.复杂度分析

时间复杂度:O(3N×4M)O(3^N × 4^M)NN 为电话号码中拥有 3 个字母的按键个数,MM为电话号码中拥有 4 个字母的按键个数。
空间复杂度:O(3N×4M)O(3^N × 4^M),同上。