[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

时间:2021-07-21 06:04:43

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.

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

题意:

给定一个数字串,看看有多少种对应的字母串。

思路:

Assumption:

字符串的合法性,是否包含1这个数字?如果包含,怎么处理?同样,输入是否考虑 * 或 #?

空字符串怎么处理?

多个解按什么顺序返回?

High Level带着面试官walk through:

take "23" for example:

when index = 0,  pointing to '2' in "23"

String letters  =  "abc"

for each char in letters,

add to path

move index forward, pointing to '3' in "23",  recursively call the helper function to add every char of "def" to the path

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

[leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合

code

 class Solution {
private static String[] keyboard =
new String[]{ " ", "", "abc", "def", // '0','1','2',...'9'
"ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; public List<String> letterCombinations(String digits) { //"23"
List<String> result = new ArrayList<>();
if(digits.length() == 0 ) return result;
helper(digits, 0, new StringBuilder(), result);
return result;
} private void helper(String digits, int index, StringBuilder sb, List<String> result){
if(index == digits.length()){
result.add(sb.toString());
return;
}
String letters = keyboard[digits.charAt(index) - '0'];
for(int i = 0; i < letters.length(); i++ ){
char c = letters.charAt(i);
sb.append(c);
helper(digits, index+1, sb, result);
sb.deleteCharAt(sb.length() - 1);
}
}
}

注意: 这个题也可以用String path来存每条路径。 可是我自己觉得用StringBuilder这么动态伸缩,更显得有“Backtracking”的味道。