17. 电话号码组合
17. 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"].
深度优先遍历(DFS)
首先先定义一个map映射为手机键盘上的数组,如2对应的是abc。这使用下标表示数字,所以对下标为0和1的值设置为空字符串。
我们可以将这个想象成一棵树来进行深度优先遍历。其中数字的长度所代表的是这棵树的层数。而对于某一层而言,所有节点的值都为对应该层数字的映射的字符。如数字2对应的层数的节点值必为a,b,c。然后进行深度遍历,到根节点即所给字符串的末尾结束遍历。
class Solution {
private String[] map = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
private List<String> result;
public List<String> letterCombinations(String digits) {
result = new ArrayList<>();
if(digits == null || digits.length() == 0){
return result;
}
combineDigits(digits,0,new StringBuilder());
return result;
}
public void combineDigits(String digits,int index,StringBuilder sb){
if(index == digits.length()){
result.add(sb.toString());
return;
}
char c = digits.charAt(index);
String letters = map[c - '0'];
for(int i = 0; i < letters.length(); i++){
combineDigits(digits,index + 1, sb.append(letters.charAt(i)));
sb.deleteCharAt(sb.length() - 1);
}
}
}
直接拼接
直接拼接很简单,就是扫描数字,每一个数字对应的字符和之前的得到的字符串进行拼接,然后更新字符串。
class Solution {
Map<Character,String[]> digitToLetterMap = new HashMap<>(){{
put('2',new String[]{"a","b","c"});
put('3',new String[]{"d","e","f"});
put('4',new String[]{"g","h","i"});
put('5',new String[]{"j","k","l"});
put('6',new String[]{"m","n","o"});
put('7',new String[]{"p","q","r","s"});
put('8',new String[]{"t","u","v"});
put('9',new String[]{"w","x","y","z"});
}};
private List<String> result;
public List<String> letterCombinations(String digits) {
if(digits==null || digits.length() == 0) {
return new ArrayList();
}
result = Arrays.asList(digitToLetterMap.get(digits.charAt(0)));
int i=1;
while (i<digits.length()){
combineTwoDigits(digitToLetterMap.get(digits.charAt(i)));
i++;
}
return result;
}
private void combineTwoDigits(String[] letters){
List<String> re = new ArrayList<>(result.size() * letters.length);
for(int i=0;i<result.size();i++){
for(int j=0;j<b.length;j++){
StringBuilder sb = new StringBuilder();
sb.append(result.get(i));
sb.append(letters[j]);
re.add(sb.toString());
}
}
result = re;
}
}