17. 电话号码的字母组合
难度 中等
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
广度优先搜索
-
使用 map 存储数字字符到字母串的映射
map<char, string> hashTable{ {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};
-
循环使用 queue 完成数字字符串到字母串的转换
//定义两个队列 queue<string> q, temp; //初始化队列q,将数字串的第一个数字字符映射的字母串中的字母依次放入队列 for (int i = 0; i < hashTable[digits[0]].length(); i++) { char c = hashTable[digits[0]][i]; string s(1,c); //使用string的构造方法将char转为string q.push(s); } //第一层循环,依次取出剩下的数字字符映射的字母串 for (int i = 1; i < digits.length(); i++) { string current = hashTable[digits[i]]; //第二层循环,每次从队列q中取出所有部",与新字母串中的字母一一组合成新的字串放入队列temp中 while (!q.empty()) { string str = q.front(); q.pop(); //"首部"与新字符一一组合为新字符串 for (int j = 0; j < current.length(); j++) { string new_str = str + current[j]; temp.push(new_str); } } //交换q与temp,进入下一轮组合 swap(q, temp); }
-
将结果存入vector中返回
while (!q.empty()) { string str = q.front(); q.pop(); ans.push_back(str); }
回溯算法
循环组合的次数等同于输入数字字串的长度,可以考虑使用递归
class Solution {
public:
//1. 用map记录每个数字按键对应的所有字母
map<char, string> M = {
{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"},
{'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
};
//2. 存储最终结果和临时结果的变量
vector<string> ans;
string current;
//3. DFS函数,index是生成临时结果字串的下标,
//每一个digits[index]数字对应临时结果current[index]的一位字母
void DFS(int index, string digits) {
//出口
if(index == digits.size()) {
ans.push_back(current);
return;
}
//递归调用
//对于当前输入的第index号数字(digits[index]),
//枚举其对应的所有字母(M[digits[index]][i])
for(int i = 0; i < M[digits[index]].size(); i++) {
current.push_back(M[digits[index]][i]); //临时结果压入一个字母
//以在当前位置压入该字母这一“情况”为前提,构造此“分支”的后续结果
DFS(index + 1, digits);
//状态还原,例如临时结果从 "ab" -> "a",下一次循环尝试"ac"
current.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) {
return ans;
}
DFS(0, digits);
return ans;
}
};
作者:rosegardenrookie
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/c-hui-su-shuang-100-zhu-shi-xiang-xi-by-rosegarden/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。