题目链接
题目描述
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = “23”
输出: [“ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”]
示例 2:
输入: digits = “”
输出: []
示例 3:
输入: digits = “2”
输出: [“a”,”b”,”c”]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
解题思路
方法一:暴力法
暴力遍历所有的情况
class Solution {
public List<String> letterCombinations(String digits) {
int len = digits.length();
List<String> res = new ArrayList<>();
if(len==0){
return res;
}
Map<Character,StringBuilder> mp = new HashMap<>();
mp.put('2',new StringBuilder("abc"));
mp.put('3',new StringBuilder("def"));
mp.put('4',new StringBuilder("ghi"));
mp.put('5',new StringBuilder("jkl"));
mp.put('6',new StringBuilder("mno"));
mp.put('7',new StringBuilder("pqrs"));
mp.put('8',new StringBuilder("tuv"));
mp.put('9',new StringBuilder("wxyz"));
if(len==1){
for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i)));
}
}else if(len == 2){
for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j)));
}
}
}else if(len == 3){
for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
for(int k = 0;k<mp.get(digits.charAt(2)).length();k++){
res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j))+String.valueOf(mp.get(digits.charAt(2)).charAt(k)));
}
}
}
}else{
for(int i = 0;i<mp.get(digits.charAt(0)).length();i++){
for(int j = 0;j<mp.get(digits.charAt(1)).length();j++){
for(int k = 0;k<mp.get(digits.charAt(2)).length();k++){
for(int l = 0;l<mp.get(digits.charAt(3)).length();l++){
res.add(String.valueOf(mp.get(digits.charAt(0)).charAt(i))+String.valueOf(mp.get(digits.charAt(1)).charAt(j))+String.valueOf(mp.get(digits.charAt(2)).charAt(k))+String.valueOf(mp.get(digits.charAt(3)).charAt(l)));
}
}
}
}
}
return res;
}
}
方法二:回溯法
class Solution { public List<String> letterCombinations(String digits) { List<String> ans = new ArrayList<String>(); if(digits.length()==0){ return ans; } Map<Character,String> phoneMap = new HashMap<Character,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"); }}; backtrack(ans,phoneMap,digits,0,new StringBuilder()); return ans; } private void backtrack(List<String> ans,Map<Character,String> phoneMap,String digits,int index,StringBuilder combination){ if(index == digits.length()){ ans.add(combination.toString()); }else{ char digit = digits.charAt(index); String letter = phoneMap.get(digit); int len = letter.length(); for(int i=0;i<len;i++){ combination.append(letter.charAt(i)); backtrack(ans,phoneMap,digits,index+1,combination); combination.deleteCharAt(index); } } } }