题目
给定一个仅包含数字?2-9?的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
解题思路
??递归+回溯。比较经典的写法,对于当前节点先拿上一个值,再进入DFS的下一个节点,之后回溯再把当前节点拿的值去掉。
代码
class Solution {
public Map<Character, String> map = new HashMap<>();
public List<String> ans = new ArrayList<>();
public void dfs(StringBuilder com, String digits, int index) {
if (index == digits.length()) {
ans.add(com.toString());
return;
}
String nowLetters = map.get(digits.charAt(index));
int length = nowLetters.length();
for (int i = 0; i < length; i++) {
com.append(nowLetters.charAt(i));
dfs(com, digits, index + 1);
com.deleteCharAt(index);
}
}
public List<String> letterCombinations(String digits) {
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");
if (digits.length() == 0) return ans;
dfs(new StringBuilder(), digits, 0);
return ans;
}
}
??输入为空串的时候返回的是 [] ,而不是 [""] ,这也被WA了一次,很好今天也是破防的一天。
|