题目描述:
给出一个仅包含数字的字符串,给出所有可能的字母组合。
数字到字母的映射方式如下:(就像电话上数字和字母的映射一样)
example:
string "23"Output:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解题思路:
- 首先我们确实一下是用递归来求解
- 然后我们需要完成数字键盘与字母之间的映射,并将结果放入 list 中
- 最后,通过递归的形式来求解
举例:
2 -> a,b,c
3 -> d,e,f
4 -> g,h,i
遍历的先后顺序为:
adg, adh, adi,
aeg, aeh, aei,
afg, afh, afi,
bdg, bdh, bdi,
beg, beh, bei,
。。。。
代码如下:
ArrayList<String> resultList = new ArrayList<>();
public ArrayList<String> letterCombinations(String digits) {
String tempRes = "";
char [] dig = digits.toCharArray();
ArrayList<char[]> list = new ArrayList<>();
// 完成数字与字母的映射转换并将结果放入 list 集合
char [] two = {'a', 'b', 'c'};
char [] three = {'d', 'e', 'f'};
char [] four = {'g', 'h', 'i'};
char [] five = {'j', 'k', 'l'};
char [] six = {'m', 'n', 'o'};
char [] seven = {'p', 'q', 'r','s'};
char [] eight = {'t', 'u', 'v'};
char [] nine = {'w', 'x', 'y','z'};
list.add(two);list.add(three);
list.add(four);list.add(five);
list.add(six);list.add(seven);
list.add(eight);list.add(nine);
int strlen = dig.length;
recursion(0, dig, list, tempRes);
return resultList;
}
// 递归函数
private void recursion(int curlen, char [] dig, ArrayList<char[]> list, String tempRes){
// 递归结束条件
if(curlen == dig.length){
resultList.add(tempRes);
return;
}
// 每次取出当前 curlen 对应的数字,再由数字取出对应的字符集,再通过递归的形式每次取出当前字符集的一个字符进行拼接
for(int i = 0; i < list.get(dig[curlen] - '2').length; i++){
recursion(curlen + 1, dig, list, tempRes + String.valueOf(list.get(dig[curlen] - '2')[i]));
}
}