(思路:回溯实现排列组合)
1.题目如下:
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number
2.代码如下:
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> combinations;
//如果为0,直接返回
if(digits.length()==0){
return combinations;
}
//用字典存储每个按键对应的字母
unordered_map<char,string> numbers{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;
backTrack(combinations,numbers,0,digits,combination);
return combinations;
}
void backTrack(vector<string> &combinations,const unordered_map<char,string> numbers,int index,const string& digits,string& combination){
//index==digits.length()代表遍历到了指定长度的几个字母,作为一个结果存储
if(index==digits.length()){
combinations.push_back(combination);
}
else{
char digit=digits[index];
const string& letters=numbers.at(digit);
//遍历letters,相当于广度遍历树
for(const char&x:letters){
//放树树这一层的一个分支
combination.push_back(x);
//向下一层遍历
backTrack(combinations,numbers,index+1,digits,combination);
//撤回原来的分支,为了加入同一层的下一个分支再向下
combination.pop_back();
}
}
}
};