题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
题目分析
将数字与字母的对应关系用 Map 集合存放起来,数字为键,字母组成的字符串为值。
将输入字符串中的数字对应的字母组成的字符串从 Map 集合中一一取出再进行对应的排列组合操作,并将排列组合后的字符串放入 List 集合中。
这里注意因为每个数字对应的字符串长度不完全一样,所以用递归来实现。
代码实现
class Solution {
public List<String> letterCombinations(String digits) {
List<String> list = new ArrayList<String>();
//如果输入串为空,返回的集合中也没有值,注意这里不是返回null
if(digits.isEmpty())
return list;
//定义Map集合,并将对应的数据放入map中
Map<Character, String> map = new HashMap<Character, String>();
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");
String[] strs = new String[digits.length()];
for(int i = 0; i < digits.length(); i++) {
char c = digits.charAt(i);
strs[i] = map.get(c); //将每个value值都放入字符串数组中
}
getList("", digits, 0, list, map);
return list;
}
private void getList(String s, String digits, int i,
List<String> list, Map<Character, String> map) {
//递归调用直到输入串遍历完成,将排列组合的字符串放入list集合
if(i == digits.length()) {
list.add(s);
return;
}
//用输入串中的每个数字作为key值在map集合中拿到对应的value值
String str = map.get(digits.charAt(i));
//将拿到的字符串拆分成多个字符分别再与接下来拿到的字符串排列组合
for(int j = 0; j < str.length(); j++) {
getList(s.concat(String.valueOf(str.charAt(j))), digits, i+1, list, map);
}
}
}