题目介绍
力扣17题:leetcode-cn.com/problems/le…
分析
关于这种组合排列的题目,我们肯定能够直接想到使用回溯算法来解决,参考[回溯算法框架总结],回溯算法的代码框架都是通用的,无非就是稍微修改以下,代码框架如下:
result = []
public void backtrack(路径, 选择列表) {
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
}
所以本题也类似,由于每个数字上面都有对应的字母【除了数字1】,我们可以使用HashMap结构存储数字跟字母的对应关系。代码如下:
class Solution {
//初始化HashMap,存储数字跟字母的对应关系
HashMap<Character, String> numberMap = 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");
}
};
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
StringBuffer solution = new StringBuffer();
if("".equals(digits)) {
return result;
}
backTrack(digits, result, solution, 0);
return result;
}
public void backTrack(String digits, List<String> result, StringBuffer solution, int i) {
int n=digits.length();
//结束条件
if(i >= n){
result.add(solution.toString());
return;
}
//获取数字
char digit = digits.charAt(i);
//根据数字获取到对应的字母
String letters = numberMap.get(digit);
for(int j = 0; j < letters.length(); j++){
//做选择
solution.append(letters.charAt(j));
//递归
backTrack(digits,result,solution,i+1);
//回溯
solution.deleteCharAt(i);
}
}
}