解题思路:
深度搜索,配合字典的使用。如果把组合看成一颗树,那么就是要从树根找到leaf,在leaf那里把string添加到要返回的vector里面。
实现方面,主要注意 string.c_str() 的巧妙使用。以及最后加入到 结果集合的 str的长度已定要满足与digits长度一致(如果不注意,输入为空时,你会得到一个WA)
class Solution {
public:
vector<string> letterCombinations(string digits) {
map<char, string> dict;
dict['2'] = "abc";
dict['3'] = "def";
dict['4'] = "ghi";
dict['5']="jkl";
dict['6']="mno";
dict['7']="pqrs";
dict['8']="tuv";
dict['9']="wxyz";
vector<string> ret;
tracking(digits.c_str(), dict, "", ret);
return ret;
}
void tracking(const char* ch, map<char, string> &dict, string str, vector<string> &ret){
if (*ch == '\0'){
if (str.length() > 0)
ret.push_back(str);
}else{
auto it = dict.find(*ch);
if (it != dict.end()){
string tosearch = it->second;
int ind = 0;
while(ind < tosearch.length()){
tracking(ch+1, dict, str+tosearch[ind], ret);
ind++;
}
}else{
printf("invalid input.");
}
}
}
};