树形结构
本题是求多个集合的组合。 而之前的[组合]是集合内部的组合(https://editor.csdn.net/md/?articleId=115530266)
回溯三步曲
- 返回值与参数
void findCombination(const string &digits, int index, const string &s)
- 终止条件
if(index == digits.size()){
res.push_back(s);
return;
}
- 搜索过程
//本题是求多个集合的组合,故i从0开始!!!
for(int i = 0; i < letters.size(); i++){
findCombination(digits, index+1, s + letters[i]); //注意index+1 !!!不是i+1!!! index+1 决定了深度 而i决定宽度
}
整体代码
class Solution {
private:
const string letterMap[10] = {
" ", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"tuv", //8
"wxyz" //9
};
vector<string> res;
//s中保存了此时从digits[0...index-1]翻译得到的一个字母字符串
//寻找和digits[index]匹配的字母,获得digits[0...index]翻译得到的解
void findCombination(const string &digits, int index, const string &s){
//cout<<index<<" : "<<s<<endl;
if(index == digits.size()){
res.push_back(s);
cout<<s<<" return"<<endl;
//cout<<"get "<<s<<", return"<<endl; //递归到底的时候
return;
}
char c = digits[index];
string letters = letterMap[c - '0'];
for(int i = 0; i < letters.size(); i++){
//cout<<"digits["<<index<<"] = "<<c<<" , use "<<letters[i]<<endl;
findCombination(digits, index+1, s + letters[i]);
}
//cout<<"digits["<<index<<"] = "<<c<<"complete, return"<<endl;
cout<<s<<" complete: return"<<endl;
return; //循环结束之后就return1
}
public:
vector<string> letterCombinations(string digits) {
res.clear();
if(digits == "")
return res;
findCombination(digits, 0, "");
return res;
}
};