给定一个数字字符串,返回该数字可能代表的所有可能的字母组合。
下面给出了数字到字母的映射(就像在电话按钮上一样)。
输入:数字串 “23”
输出: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]。
注意: 虽然上面的答案是按字典顺序排列的,但您的答案可以是您想要的任何顺序。
解题思路:
- 对于此类枚举问题,我们首先应该想到的是用递归来实现求解
- 分析题目,可以发现不同的数字对应不同的字母,故用字典来实现该数据结构
- 用一个变量 begin 来记录已生成字符串中包含的字母个数,当 begin 个数等于传入的参数时,添加到结果数据结构中
代码如下:
// 全局变量来存储结果
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> letterCombinations(String digits) {
// 将参数字符串转换成字符数组
char [] chars = digits.toCharArray();
// 将题目中的数字与字母转换成字典的形式
ArrayList<char []> ll = new ArrayList<>();
char [] a2 = {'a', 'b', 'c'};
char [] a3 = {'d', 'e', 'f'};
char [] a4 = {'g', 'h', 'i'};
char [] a5 = {'j', 'k', 'l'};
char [] a6 = {'m', 'n', 'o'};
char [] a7 = {'p', 'q', 'r', 's'};
char [] a8 = {'t', 'u', 'v'};
char [] a9 = {'w', 'x', 'y', 'z'};
ll.add(a2);ll.add(a3);ll.add(a4);ll.add(a5);
ll.add(a6);ll.add(a7);ll.add(a8);ll.add(a9);
combine(chars,ll,"",0);
return res;
}
private void combine(char[] s, ArrayList<char []> ll, String t, int begin){
// 如果 begin 的长度等于传入参数的长度,则添加进结果集中
if(begin == s.length){
res.add(t);
return;
}
// 递归取出各数字对应的字符
for(int i = 0; i < ll.get(s[begin] - '2').length; i++){
combine(s, ll, t + String.valueOf(ll.get(s[begin] - '2')[i]),begin + 1);
}
}