这道题让我们求电话号码的字母组合,即数字2到9中每个数字可以代表若干个字母,然后给一串数字,求出所有可能的组合。
我想到类似全排列那样的题目,这道题也是典型的回溯问题,每一个位置都有几个选择,求这些选择的全排列。但是以前的题目是,这些位置有一个共同的选择范围,一般是一个数组。但是这个题是,每个位置有每个位置各自不同的选择范围。其实还是一样的,只是要设一个字典,再设一个level表示现在是在哪一个位置上做选择,然后找到这个位置对应的选择范围即可。和之前的题目一样的。
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.size() == 0)
return {};
vector<string> dict = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> res;
string s;
backtracking(digits, dict, s, res, 0);
return res;
}
void backtracking(string digits, vector<string>& dict, string& s, vector<string>& res, int level)
{
if(level == digits.size())
{
res.push_back(s);
return;
}
string dictstr = dict[digits[level] - '2'];
for(auto a : dictstr)
{
s.push_back(a);
backtracking(digits, dict, s, res, level+1);
s.pop_back();
}
}
};