17. 电话号码的字母组合
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
回溯法
有时思维定式真的好可怕,总想着怎么让digits[0]与digits[1]去搭配,但如果是三个数字组合呢,思维要崩了。唉,其实可以用一个空字符串变量来累加每个数字所对应的字符啊。当长度与digits长度相同时,就产生一个组合了。
class Solution {
private:
unordered_map<char,string> mp{
{'0',""},
{'1',""},
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}};
public:
vector<string> letterCombinations(string digits) {
vector<string> s;
if(digits == "") return s;
dfs(s,"",digits,0);
return s;
}
void dfs(vector<string>& res,string str,string digits,int k)
{
if(str.size() == digits.size())
{
res.push_back(str);
return;
}
for(auto &r:mp[digits[k]])
{
str+=r;
dfs(res,str,digits,k+1);
str.pop_back(); //还原
}
}
};