0
点赞
收藏
分享

微信扫一扫

【c++】leetcode题目--17、电话号码的字母组合--bfs、树实现<每日一题>

晚熟的猫 2022-03-11 阅读 65

题目链接

17. 电话号码的字母组合 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1L8https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

 这一题可以说是现学现卖了。

我的思路是:

1、电话号码的每一个数字都对应一个字符串,很像一个n叉树,所以我们可以根据宽度优先的思想,来解决这个题目。

2、在三番五次的询问dalao之后,我终于了解到:可以使用一个队列,在遍历digits的同时将其对应的字符压入队列,根据bfs的模板,解决这个题目并不是很难。

注释很多,大家请看吧:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string>arr;//返回
        int len = digits.length();
        if(len == 0)
            return arr;
        vector<string>str1 = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        queue<string>q;
        q.push(""); //什么也不加,但是满足front()函数的要求(队列非空)
        while(q.front().length() != len)//队列只能访问第一个和最后一个元素,我们可以借此判断是否压满
        {
            string ret = q.front();//用于存储临时的字符串
            q.pop();  //不要害怕这里可能会漏掉,因为弹出去之后还会有新的处理好了的加进来!
            string str2 = str1[digits.at(ret.size()) - '2'];//此时str2存储了一个像“abc”一样的字符串
            for(int i = 0; i < str2.length(); i++)
                q.push(ret + str2[i]);  //ret + str2[i]就是处理字符串,再压到队列里面,顺序不变,所以前面弹出了也不要紧
        }
        int n = q.size();//一定要将q的尺寸提前存起来,因为后面他的尺寸是会变的
        for(int i = 0; i < n; i++)
        {
            arr.push_back(q.front());//注意vector和queue不同的压入函数
            q.pop();
        }
        return arr;
    }
};

希望与诸君共勉。

举报

相关推荐

0 条评论