题目描述
给定一个仅包含数字 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']
的一个数字。
题解
思路
如果使用暴力搜索,那么题目中给出的digits有几个数字,就有有几层for循环,因此不适宜使用暴力求解。
而在回溯算法中,递归的深度就是for循环的层数,因此可以使用回溯法解决本题,其中
- 递归深度就是暴力搜索中for循环的层数,也就是digits中数字的个数
- 每一层for循环遍历的是每一个数字对应的字母
class Solution {
private:
vector<string> letterMap={
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
string path;
vector<string> res;
void backing(const string& digits,int index)
{
if(path.size()==digits.size())
{
res.emplace_back(path);
return ;
}
int digit=digits[index]-'0';
string str=letterMap[digit];
for(int i=0;i<str.size();i++)
{
// path+=str[i];
path.push_back(str[i]);
backing(digits,index+1);
path.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
if(digits.size()==0)
return res;
backing(digits,0);
return res;
}
};