算法-JAVA-1ms递归解电话号码的字母组合
递归调用,难得不看题解,几次提交就通过了,纪念一下。
提交结果
执行时间1ms
代码
class Solution {
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<String>();
if(digits==null ||digits.equals("")) return ans;
String[][] map = getMap();//预处理,按个人想法就把9键对应的字母放到二维数组里了
char[] chars = digits.toCharArray();
porcess(chars,map,0,"",ans);
return ans;
}
/**
*
* @param chars 每次传入的chars都是固定的
* @param map 每次传入的map都是固定的
* @param i 表示chars 数组当前递归到的位置
* @param temp 临时String变量记录中间答案
* @param ans ans保存最终的temp答案
*/
private static void porcess(char[] chars, String[][] map, int i,String temp,List<String>ans) {
//只有当递归到chars数组的尽头,才记录答案
if(i ==chars.length){
ans.add(temp);
return ;
}
int curChar = Integer.parseInt(String.valueOf(chars[i]));
for (String curStr: map[curChar]) {
if (curStr ==null){continue;}//二维数组中有null,跳过
//以temp拼接curStr,最终能够拼出多少种结果
porcess(chars,map,i+1,temp.concat(curStr),ans);
}
}
public static String[][] getMap(){
String[][] map = new String[10][4];
String abcd = "abcdefghijklmnopqrstuvwxyz";
int index =0;
for (int i = 2; i < 10; i++) {
if(i ==7||i==9){
for (int j = 0; j< 4; j++) {
map[i][j] = abcd.substring(index,++index);
}
}else {
for (int j = 0; j< 3; j++) {
map[i][j] = abcd.substring(index,++index);
}
}
}
return map;
}
}
=