给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
public List<String> letterCombinations(String digits) {
/**
* 开始都会判断是否满足要求,不满足直接返回
* 本题难点在与怎么判断自由组合字母,运用了递归来解决几个
* 字母对应的字符自由组合,递归本来就对我们来说很难理解
*/
if (digits == null || digits.length() == 0) {
return new ArrayList();
}
Map<Integer,String> map = new HashMap<>();
//这用map集合最合适存储对用的规则
List<String> list = new ArrayList<>();
map.put(2,"abc");
map.put(3,"def");
map.put(4,"ghi");
map.put(5,"jkl");
map.put(6,"mno");
map.put(7,"pqrs");
map.put(8,"tuv");
map.put(9,"wxyz");
//申请个arr来存与digits数字对应的字符串
String[] arr = new String[digits.length()];
for (int i=0;i<digits.length();i++) {
//这注意Integer 与String的转换还有int,满足就存入arr里
if (map.containsKey(Integer.parseInt(digits.substring(i, i + 1)))) {
arr[i] = map.get((Integer.parseInt(digits.substring(i, i + 1))));
}
}
//调用方法来递归存储遍历传入s临时保存组合的字符串,k来控制arr个数,list来存所有的组合
lookString("",0,list,arr);
return list;
}
public static void lookString(String s, int k, List<String> list, String[] arr) {
//3.终止条件到arr.length说明到最后了
if (k==arr.length) {
//s由s+letters.charAt(j)叠加来第一个元素的组合比如23对应abc,def中的ad返回到下面for循环
//就变成a先与arr[1]对应的def循环在返还上次变成b与def循环下去返回
list.add(s);
return;
}
//1.首先定义arr里的那个用k来控制
String letters = arr[k];
//其次遍历这个k对应得字符
for (int j=0;j<letters.length();j++) {
/**
* 2
*递归调用这个letter的k对应的下个arr[k],s开始为0,递归第一次s就变为arr对应的j值
*k增加往后移
*/
lookString(s+letters.charAt(j),k+1,list,arr);
}
}