- 17.电话号码的字母组合
- 思路:
相比前面的回溯题,这道题差异在于在有多个集合(有一串数字,每次从当前数字对应的字符串中选一个字母出来组成字符串添加到结果集中);
需用unordered_map来储存<数字, 字符串>的映射
常规的结果集合 vector res 和 遍历的当前路径 string path
class Solution {
private:
unordered_map<char, string> um = {{'2', "abc"}, {'3', "def"}, {'4', "ghi"},
{'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"},
{'8', "tuv"}, {'9', "wxyz"}};
vector<string> res;
string path;
void backtracking(const string& digits, int curNum) {//参数curNum来指出当前遍历到哪个集合,而不用startIndex,因为对于多集合来说每个集合都从0开始遍历,而对于单集合来说需要startIndex来指出从哪个位置开始
if (curNum == digits.size()) {//终止条件,到了树了叶子节点
res.push_back(path);
return;
}
string temp = um[digits[curNum]];//确定当前集合
for(int i = 0; i < temp.size(); ++i) {//遍历当前集合
//if ()。。。这里其实可以加个判断,若是2~9以外的字符,则continue
path.push_back(temp[i]);//先走
backtracking(digits, curNum + 1);//递归
path.pop_back();//回溯
}
}
public:
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) return res;
backtracking(digits, 0);
return res;
}
};
总结:
- 回溯有单集合和多集合之分;对应的回溯函数的参数也不同