Leetcode17. Letter Combinations of a Phone Number
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given below.
Note that 1 does not map to any letters.
Example:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
解法:
1.递归
2.利用队列
class Solution {
//HashMap集合中key只能为引用数据类型,不能为基本类型
Map<String, String> phone = new HashMap<String, String>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
List<String> output = new ArrayList<String>();
////参数为目前已经产生的组合;接下来准备要输入的数字
public void backtrack(String combination, String next_digits) {
if (next_digits.length() == 0) {//先找递归出口
output.add(combination);
}else{
String digit = next_digits.substring(0, 1);//取next_digits的左边第一个字符
String letters = phone.get(digit);//get返回key对应的value
for (int i = 0; i < letters.length(); i++) {
String letter = phone.get(digit).substring(i, i + 1);//将value的字符依次取出
backtrack(combination + letter, next_digits.substring(1));//前移一位
}
}
}
public List<String> letterCombinations(String digits) {
if (digits.length() != 0)
backtrack("", digits);
return output;
}
}
class Solution {
public List<String> letterCombinations(String digits) {
if(digits==null || digits.length()==0) {
return new ArrayList<String>();
}
String[] letter_map = {//一个映射表,第二个位置是"abc“,第三个位置是"def"
" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};//这里也可以用map,用数组可以更节省点内存
List<String> res = new ArrayList<>();
res.add("");//先往队列中加入一个空字符
for(int i=0;i<digits.length();i++) {
String letters = letter_map[digits.charAt(i)-'0'];//由当前遍历到的字符,取字典表中查找对应的字符串
int size = res.size();
for(int j=0;j<size;j++) {//计算出队列长度后,将队列中的每个元素挨个拿出来
String tmp = res.remove(0);//每次都从队列中拿出第一个元素
for(int k=0;k<letters.length();k++) {//然后跟"def"这样的字符串拼接,并再次放到队列中
res.add(tmp+letters.charAt(k));
}
}
}
return res;
}
}
参考链接
leetcode题解