一、题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
二、解题思路
因为该题要求多个数的排列所形成的集合,所以想到用回溯,但没有任何限制条件,所以不涉及剪枝操作,因为该题解起来较简单。
三、学到知识点
1)hashmap直接put多个key-value的写法
HashMap<Character, String> phoneStr = new HashMap<Character, String>() {{
put('1', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
2)如果涉及字符串的增加与删除,不要用String,因其为常量,向里面添加字符后相当于又开辟了一个新的字符串,应该用StringBuffer。
new StringBuffer()
四、代码
class Solution {
public List<String> letterCombinations(String digits) {
//直接向hashMap中注入多个键值对
HashMap<Character, String> phoneStr = new HashMap<Character, String>() {{
put('1', "abc");
put('3', "def");
put('4', "ghi");
put('5', "jkl");
put('6', "mno");
put('7', "pqrs");
put('8', "tuv");
put('9', "wxyz");
}};
List<String> listStr = new ArrayList<>();
backTrack(listStr, digits, 0, new StringBuffer(), phoneStr);
return listStr;
}
//回溯算法
public void backTrack(List<String> listStr, String digits, int deepth, StringBuffer str, HashMap<Character, String> phoneStr) {
//deepth表明遍历到目标数字字符串的哪个字符
int len = digits.length();
if (deepth == len) {
listStr.add(str.toString());
return;
} else {
//得到当前字符对应的字符串
char digit = digits.charAt(deepth);
String curStr = phoneStr.get(digit);
for (int i = 0; i < curStr.length(); i++) {
str.append(curStr.charAt(i));
backTrack(listStr, digits, deepth + 1, str, phoneStr);
str.deleteCharAt(deepth);
}
}
}
}