【回溯】电话号码的字母组合

17. 电话号码的字母组合

给定一个仅包含数字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']的一个数字。


解题思路:

(1)一共有几个数字,每一组字符串的长度就有多长

(2)一个数字一个数字的叠加,可以画出树状图,树状图一般可以用回溯来返回所有组合。

(3)回溯:先递归到一个组合的最底部,逐层返回值。

本题采用传递一个容器引用,在递归函数传递每次组合的结果(感觉有点想递推下去的,有点不标准)。在递归的最底时,直接将结果push_back()到容器里。


函数设计:

void func(string current,string input,int num,vector<string> res):

    {这里设置好数字与字母的键值对}

    如果num==input.length():    res.push_back(current);

    否则:

        for (auto i : 键值对[input[num]-'0']):

              string temp=current+i;

              func(temp,input,num+1,res);


    void func(string d,string current,int num,vector<string> &res){

        vector<vector<char>> data=

        {

            {},

            {},

            {'a','b','c'},

            {'d','e','f'},

            {'g','h','i'},

            {'j','k','l'},

            {'m','n','o'},

            {'p','q','r','s'},

            {'t','u','v'},

            {'w','x','y','z'},

        };

        if (d.length()==0) {}

        else if (num==d.length()){

            res.push_back(current);

        }

        else{

            for (auto i : data[d[num]-'0']){

                string temp="";

                temp=temp+i;

                temp=current+temp;

                func(d,temp,num+1,res);

            }

        }

    }

    vector<string> letterCombinations(string digits) {

        vector<string> res;

        func(digits,"",0,res);

        return res;

    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容