题目:
这个题目有两个思想:循环与递归
我首推递归思想,简单明了。
递归的思想:
递归的思想就是一次成完整的串,成完整的串之后,加入res,然后递归回溯,再构成其他的串。主要还是循环和递归地结合,核心是一次就得到最终结果的一部分。
class Solution {
public:
void dfs(vector<string>& res,
string& digits,int index,
string tmp_s,
unordered_map<char,string>& map){
if(index == digits.size()){
res.push_back(tmp_s);
return ;
}
char tmp_c = digits[index];
string& tmp_str = map[tmp_c];
for(const char& c : tmp_str){
tmp_s.push_back(c);
dfs(res,digits,index+1,tmp_s,map);
tmp_s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
vector<string> res;
unordered_map<char,string> map={
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
if(digits.size() == 0){
return res;
}
dfs(res,digits,0,"",map);
return res;
}
};
循环的思想:
循环的思想是,当遍历到一个新的字符的时候,就把这个字符的所有可能都添加到res中,此方法只有到最终时刻,才会形成最终结果,没有回溯的思想。
class Solution {
public:
map<char,string> m;
void init(){
m['2']="abc";
m['3']="def";
m['4']="ghi";
m['5']="jkl";
m['6']="mno";
m['7']="pqrs";
m['8']="tuv";
m['9']="wxyz";
}
vector<string> letterCombinations(string digits) {
init();
vector<string> res;
if(digits.size()<=0) return res;
for(int k = 0;k < m[digits[0]].size();k++){
char x = m[digits[0]][k];
string a;
res.push_back(a+x);
}
for(int i=1;i<digits.size();i++){
int size = res.size();
for(int j = 0;j < size;j++){
string tmp = res[0];
res.erase(res.begin());
for(int k = 0 ;k< m[digits[i]].size();k++){
res.push_back(tmp+m[digits[i]][k]);
}
}
}
return res;
}
};