【题目】
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
【思路】
使用res存储结果,对于每个数字,将所有可能代表的字符依次加在res的字符串中。
比如,res为["a", "b", "c"],当遇到数字2时,添加所有可能的字符,得到["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"],以此类推。
(网上有一个比较好的方法:使用队列存储结果,每次得到队首元素,依次添加可能的字符后加入队列,再弹出队首元素。)
【代码】
python版本
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if len(digits) == :
return []
res = ['']
d = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
for digit in digits:
tmp = []
for c in d[digit]:
for ri in res:
tmp.append(ri+c)
res = copy.copy(tmp)
return res
C++版本
class Solution {
public:
vector<string> letterCombinations(string digits) {
map<char, string> d;
vector<string> res;
if(digits.size() == )
return res;
d['2'] = "abc";
d['3'] = "def";
d['4'] = "ghi";
d['5'] = "jkl";
d['6'] = "mno";
d['7'] = "pqrs";
d['8'] = "tuv";
d['9'] = "wxyz";
res.push_back("");
vector<string> tmp;
char c;
for(int i=; i < digits.size(); i++){
tmp.clear();
for(int j=; j < d[digits[i]].size(); j++){
c = d[digits[i]][j];
for(auto r: res){
tmp.push_back(r+c);
}
}
res.swap(tmp);
}
return res;
}
};