给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
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()){
combinations.push_back(combination);//如果组合长度达标就添加到容器中
}
else{
char digit = digits[index];
const string& letters = phoneMap.at(digit);//获取到对应的字母组合
for(const char& letter:letters){
combination.push_back(letter);//在该index中选择一个字母添加上index-1所选择出来的字母后面
backtrack(combinations,phoneMap,digits,index+1,combination);//递归添加
combination.pop_back();//结束一种情况清空combination重新组合下一种
}
}
}
};