给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意 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']的一个数字。
解题思路:
(1)一共有几个数字,每一组字符串的长度就有多长
(2)一个数字一个数字的叠加,可以画出树状图,树状图一般可以用回溯来返回所有组合。
(3)回溯:先递归到一个组合的最底部,逐层返回值。
本题采用传递一个容器引用,在递归函数传递每次组合的结果(感觉有点想递推下去的,有点不标准)。在递归的最底时,直接将结果push_back()到容器里。
函数设计:
void func(string current,string input,int num,vector<string> res):
{这里设置好数字与字母的键值对}
如果num==input.length(): res.push_back(current);
否则:
for (auto i : 键值对[input[num]-'0']):
string temp=current+i;
func(temp,input,num+1,res);
void func(string d,string current,int num,vector<string> &res){
vector<vector<char>> data=
{
{},
{},
{'a','b','c'},
{'d','e','f'},
{'g','h','i'},
{'j','k','l'},
{'m','n','o'},
{'p','q','r','s'},
{'t','u','v'},
{'w','x','y','z'},
};
if (d.length()==0) {}
else if (num==d.length()){
res.push_back(current);
}
else{
for (auto i : data[d[num]-'0']){
string temp="";
temp=temp+i;
temp=current+temp;
func(d,temp,num+1,res);
}
}
}
vector<string> letterCombinations(string digits) {
vector<string> res;
func(digits,"",0,res);
return res;
}