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; }
-
-