17-电话号码字母的组合
可以看出,假如输入的有两个数字,得用两层循环得出结果。假如输入三个数字,就得是三层循环。可以用递归
class Solution {//递归, public List<String> letterCombinations(String digits) { List<String> list = new ArrayList<>();//结果集合 if (digits.equals("") || digits == null) {//假如输入为空,或者长度为0,直接返回list return list; } String now_str = "";//其中一个可能的字母组合。 addNum(digits, 0, list, now_str); return list; } //参数意思分别是1:输入。2:下标,代表当前的数字是输入里的哪个。输入“2,3”,key为1,代表的就是“3”这个数字(字符) 3:最终的结果集合。4:其中一个可能的字母组合 private static void addNum(String digits, int key, List<String> list, String now_str) { if (key == digits.length()) {//digits的下标是【0,digits.length()-1】,如果等于digits的长度了,说明已经得出了其中一个集合。把这个集合加入list,返回就行, list.add(now_str); return; } char[] values = getValue(digits.charAt(key));//比如输入是“23”,当前key为0,这个函数返回的就是2代表的字符数组,a,b,c for (int i = 0; i < values.length; i++) {//这次循环,把当前的数字,比如“2”所代表的字符a,b,c,加入可能的字母组合里面。 addNum(digits, key + 1, list, now_str + values[i]);//假如这里now_str加了'a',在这个addNum函数里面,key变成1了,也就是“3”这个数字,可以想见,在循环里面,会逐个加入"3"代表的字符,组合成ad,ae,af之后都会加入list } } private static char[] getValue(char num) {//比如当前数字是2,取出2代表的字母的字符数组 if (num == '2') { char nums[]= {'a', 'b', 'c'}; return nums; } else if (num == '3') { char nums[]= {'d', 'e', 'f'}; return nums; } else if (num == '4') { char nums[]= {'g', 'h', 'i'}; return nums; } else if (num == '5') { char nums[]= {'j', 'k', 'l'}; return nums; } else if (num == '6') { char nums[]= {'m', 'n', 'o'}; return nums; } else if (num == '7') { char nums[]= {'p', 'q', 'r', 's'}; return nums; } else if (num == '8') { char nums[]= {'t', 'u', 'v'}; return nums; } else if (num == '9') { char nums[]= {'w', 'x', 'y', 'z'}; return nums; } return null; } }