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.
python的做法:
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
dict_all = {"2":["a","b","c"],"3":["d","e","f"],"4":["g","h","i"],
"5":["j","k","l"],"6":["m","n","o"],"7":["p","q","r","s"],
"8":["t","u","v"],"9":["w","x","y","z"]}
list_all = []
for i in digits:
list_all = self.result(list_all,dict_all[i])
return list_all
def result(self,list_a,list_b):
list_res=[]
if len(list_a)==0: return list_b
elif len(list_b)==0: return list_a
else:
for i in list_a:
for j in list_b:
list_res.append(i+j)
return list_res
if __name__ == "__main__":
a = Solution()
print(a.letterCombinations("23"))
C++的做法:
http://www.cnblogs.com/grandyang/p/4452220.html
1、递归
在递归函数中我们首先判断level,如果跟digits中数字的个数相等了,我们将当前的组合加入结果res中,然后返回。否则我们通过digits中的数字到dict中取出字符串,然后遍历这个取出的字符串,将每个字符都加到当前的组合后面,并调用递归函数即可。
#include <iostream>
using namespace std;
#include <string>
#include <vector>
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
string dict[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> res;
letterCombinations_result(digits,0,"",res,dict);
return res;
}
// level表示是digits的第几个数字,out表示每个数字代表的字母拼接后的结果,但不是最终结果,是中间结果。res表示最终结果
void letterCombinations_result(string digits,int level,string out,vector<string> &res,string dict[]){
if(level == digits.size()) {res.push_back(out); return;}
string str = dict[digits[level]-'0'];
level++;
for(int i=0; i<str.size(); i++){
letterCombinations_result(digits,level,out+str[i],res,dict);
}
}
};
int main(){
Solution S;
vector<string> result= S.letterCombinations("23");
for(int i=0; i<result.size(); i++)
cout << result[i] << endl;
return 0;
}
2、迭代
在遍历digits中所有的数字时,我们先建立一个临时的字符串数组t,然后跟上面解法的操作一样,通过数字到dict中取出字符串str,然后遍历取出字符串中的所有字符,再遍历当前结果res中的每一个字符串,将字符加到后面,并加入到临时字符串数组t中。取出的字符串str遍历完成后,将临时字符串数组赋值给结果res。
#include <iostream>
using namespace std;
#include <string>
#include <vector>
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
string dict[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> res={""}; //这里必须写成{""},先放一个空的字符串,否则最里面的for循环第一次循环进行不了
string str; //每个数字代表的字符串
vector<string> t; //t用于临时存结果,然后赋值给res,每次遍历digits前要进行清空t。
for(int i=0; i<digits.size(); i++){
str = dict[digits[i]-'0'];
for(int j=0; j<str.size(); j++)
for(int k=0; k<res.size();k++)
t.push_back(res[k]+str[j]);
res=t;
t={};
}
return res;
}
};
int main(){
Solution S;
vector<string> result= S.letterCombinations("23");
for(int i=0; i<result.size(); i++)
cout << result[i] << endl;
return 0;
}