题目链接
17. 电话号码的字母组合 - 力扣(LeetCode) (leetcode-cn.com)https://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;
}
};
希望与诸君共勉。