类似于DFS算法,回溯!
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> combinations;
if(digits.empty()){
return combinations;
}
unordered_map<char,string> phoneMap{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;
backtrack(combinations,phoneMap,digits,0,combination);
return combinations;
}
void backtrack(vector<string>& combinations,const unordered_map<char,string>& phoneMap,const string& digits,int index,string& combination){
if(index == digits.length()){
// 如果是最后一个数字了,就添加进结果。
// “23”为例子,在下标index=1(数字3)时候,把对应的所有结果都添加进combinations
combinations.push_back(combination);
}else{
// 当前digit数字
char digit = digits[index];
// 找到当前数字对应map里面的字母们
const string& letters = phoneMap.at(digit);
// 遍历该数字的所有字母可能
for(const char& letter:letters){
// 一个string中把当前字母加入末尾
combination.push_back(letter);
backtrack(combinations,phoneMap,digits,index + 1,combination);
// 回溯——删除刚添加的字母
combination.pop_back();
}
}
}
};
时间复杂度O(3^m*4^n)
空间复杂度O(m+n)