题目描述:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
解题思路:
还是用了递归,官网提供的解题思路很清晰
代码:
class Solution {
Map<String, String> phone = new HashMap<String, String>(){
{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
List<String> output =new ArrayList<String>();
public void backTrack(String combination, String next_digits) {
if (next_digits.length() == 0) {
output.add(combination);
} else {
String next_digit = next_digits.substring(0,1);
String letters = phone.get(next_digit);
for (int i = 0; i < letters.length(); i++) {
String letter = letters.substring(i,i+1);
backTrack(combination + letter, next_digits.substring(1));
}
}
}
public List<String> letterCombinations(String digits) {
if (digits.length() != 0) {
backTrack("",digits);
}
return output;
}
}
另外Python的解题方法很简单,也贴一下代码:
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
m = {
'2': list('abc'),
'3': list('def'),
'4': list('ghi'),
'5': list('jkl'),
'6': list('mno'),
'7': list('pqrs'),
'8': list('tuv'),
'9': list('wxyz'),
}
if not digits: return []
ls1 = ['']
for i in digits:
ls1 = [x + y for x in ls1 for y in m[i]]
return ls1