解法一:non-recursion
class Solution {
public:
vector<string> letterCombinations(string digits) {
unordered_map<char, string> source = {{'2',"abc"}, {'3',"def"}, {'4',"ghi"},
{'5',"jkl"}, {'6',"mno"}, {'7',"pqrs"},
{'8',"tuv"}, {'9',"wxyz"}};
vector<string> res;
if(digits.empty()) return res;
res.push_back("");
for(int i=0;i<digits.size();i++){
string t = source[digits[i]];
int n = res.size();
for(int j=0;j<n;j++){
for(int k=0;k<t.size();k++){
res.push_back(res.front()+t[k]);
}
res.erase(res.begin());
}
}
return res;
}
};
解法二:recursion
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
unordered_map<char, string> source = {{'2',"abc"}, {'3',"def"}, {'4',"ghi"},
{'5',"jkl"}, {'6',"mno"}, {'7',"pqrs"},
{'8',"tuv"}, {'9',"wxyz"}};
vector<string> res;
string out;
helper(digits, 0, out, res, source);
return res;
}
void helper(string digits, int pos, string& out, vector<string>& res, unordered_map<char, string>& source){
if(pos==digits.size()) res.push_back(out);
else{
for(char a:source[digits[pos]]){
out.push_back(a);
helper(digits, pos+1, out, res, source);
out.pop_back();
}
}
}
};