**思路:和产生集合的所有子集方法类似。
例:‘23’
第一轮:
一:[‘a’,‘b’,‘c’]
遍历第一轮生成的集合,生成第二轮
二:[“ad”,“bd”,“cd”]+[“ae”,“be”,“ce”]+[“af”,“bf”,“cf”]
代码
#写法一
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits:
return []
b = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'] #加两个空字符串是为了查找对应字符更方便(学到了)
res = ['']
for i in digits:
tmp = [] ###每次更新tmp这个临时数组
for j in b[int(i)]:
for z in res:
tmp.append((z+j))
res = tmp
#写法二
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
result = []
maps = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs','8':'tuv','9':'wxyz'}
for digit in digits:
temp = []
for char in maps[digit]:
if len(result) == 0:
temp += [char]
else:
temp += [s+char for s in result]
result = temp
return result
20221205 回溯法
class Solution {
private List<String> res = new ArrayList<String>();
private HashMap<Character, String> map = new HashMap<>(){{
put('2', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
public List<String> letterCombinations(String digits) {
int n = digits.length();
if (n == 0) return res;
backtracking("", digits, 0);
return res;
}
public void backtracking(String combination, String digits, int index){
// 终止条件
if (digits.length() == index){
//存放结果
res.add(combination);
return;
}
Character c = digits.charAt(index);
String letters = map.get(c);
for (int i = 0; i < letters.length(); i++){
//递归处理节点
backtracking(combination + letters.charAt(i), digits, index + 1);
}
}
}
python版回溯
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
res = []
if len(digits) == 0:
return res
l = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
def backtracking(digits, res, tmp):
if not digits:
res.append(tmp)
return
strings = l[int(digits[0])]
for c in strings:
backtracking(digits[1:], res, tmp+c)
backtracking(digits, res, "")
return res