LeetCode 17 电话号码的字母组合
Leetcode 17 电话号码的字母组合
问题描述:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
- 2: "abc"
- 3: "def"
- 4: "ghi"
- 5: "jkl"
- 6: "mno"
- 7: "pqrs"
- 8: "tuv"
- 9: "wxyz"
回溯
执行用时:1 ms, 在所有 Java 提交中击败了88.95%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了69.50%的用户
/**思路:
* 使用DFS进行搜索,复杂度O(3^N),N<=8
* */
class Solution {
public List<String> letterCombinations(String digits) {
if(digits==null || digits.length()==0) return new ArrayList<String>();
/*优化步骤:获取各数字对应的字母*/
String[] num2char = new String[]{
"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};
/*开始搜索所有可能的组合,使用DFS*/
List<String> ans = new ArrayList<String>();
StringBuffer tmp = new StringBuffer();
dfs_rec(digits, 0, num2char, tmp, ans);
/*返回结果*/
return ans;
}
/*递归DFS遍历*/
public void dfs_rec(String digits, int start, String[] num2char, StringBuffer tmp, List<String> ans){
/*递归终止*/
if(start == digits.length()){
/*添加结果到集合*/
ans.add(new String(tmp.toString()));
return;
}
/*递归过程*/
String charsAtNum = num2char[
//digits.charAt(start)-'2'
Integer.parseInt(digits.substring(start, start+1))-2
];
/*回溯*/
for(int i=0; i<charsAtNum.length(); i++){
tmp.append(charsAtNum.substring(i,i+1));
dfs_rec(digits, start+1, num2char, tmp, ans);
tmp.delete(start, start+1);
}
/*返回*/
return;
}
}