思路:回溯
1)建立数字->字母的映射关系;2)定义递归函数
(注:如果是纯字符串拼接,会生成很多临时对象,性能会略差,Java实现中是用StringBuilder做拼接的,经测试耗时0毫秒,如果是用String类型做拼接耗时是6毫秒)
class Solution {
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList<String>();
if (digits.length() == 0) {
return combinations;
}
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(combinations, phoneMap, digits, 0, new StringBuffer());
return combinations;
}
public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer sb) {
//用index记录每次遍历到字符串的位置
if (index == digits.length()) {//递归终止条件
combinations.add(sb.toString());
} else {
char digit = digits.charAt(index);
String letters = phoneMap.get(digit);
int lettersCount = letters.length();
for (int i = 0; i < lettersCount; i++) {
//做选择(回溯算法基本模板三部曲,做选择--递归--撤销选择)
sb.append(letters.charAt(i));
//递归
backtrack(combinations, phoneMap, digits, index + 1, sb);
//撤销选择
sb.deleteCharAt(index);//deleteCharAt(int a)只有一个参数,删除索引为a的字符
}
}
}
}