LeetCode刷题记录——17电话号码的字母组合

LeetCode刷题记录——17电话号码的字母组合

一 题目描述:

给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下。注意1不对应任何字母
在这里插入图片描述

示例:

  • 输入:"23"
    输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
    

二 思路:

  • 递归遍历:
    在这里插入图片描述

    如图从最底层开始,然后逐层往上进行递归调用,例如,对于打印"2345"这样的字符串:
    第一次递归就是上图中最下面的方格,然后处理完第一个字符2之后,将输入的字符改变成"345"并调用第二个递归函数
    第二次递归处理3,将字符串改变成"45"后再次递归
    第三次递归处理4,将字符串改变成"5"后继续递归
    第四次递归处理5,将字符串改变成""后继续递归
    最后发现字符串为空了,将结果放到列表中并返回

    • 代码:

      • vector<string> table = {"abc","def","ghi","jkl","mno","qprs","tuv","wxyz"};
        
        void func(vector<string> &res,string str,string &digits,int i){
            if(i>=digits.size()){ //跳出条件,结合图理解,文字不好描述
                if(str.size() > 0 ){
                    res.push_back(str);
                }
                return ;
            }
            else{
                string s = table[digits[i] - '2']; //得到当前的数字对应的字母串
                for(int j = 0;j<s.size();j++){ //递归调用,结合上图理解
                    str.push_back(s[j]);
                    func(res,str,digits,i+1);
                    str.pop_back();
                }
            }
        
        }
        
        vector<string> letterCombinations(string digits){
            vector<string> res;
            func(res,"",digits,0);
            return res;
        }
        
  • 队列:

    • 先把第一个数字对应的字母串放在队列头,比如23,就先把abc放在按照顺序放在队列中,然后从队列中拿出第一个a,与3对应的字母串拼接,同样的方式,讲b与3对应的字母串拼接,直到结束

    • 代码

      • vector<string> letterCombinations(string digits){
            vector<string> res; //用于输出向量
            //映射map哈希表
            map<char,string> m = { {'2',"abc" },{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"} };
            int size = digits.size();
            queue<string> que;
        
            //将第一个数字对应的字母串入队列
            for(int j = 0;j<m[digits[0]].size();j++){
                string str;
                str.push_back(m[digits[0]][j]);
                que.push(str);
            }
            string s ; //存储队列头元素
            for(int i = 1;i < size;i++){
                int length = que.size();//当前队列的长度
                while(length--){
                    for(int j = 0;j<m[digits[i]].size();j++){
                        s = que.front();
                        s = s+m[digits[i]][j];//队列头元素加上新元素
                        que.push(s);
                    }
                    que.pop();
                }
            }
            while(!que.empty()){
                res.push_back(que.front());
                que.pop();
            }
            return res;
        }
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值