大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
17. 电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
分析
相当于一个排列组合问题

String
class Solution {
String[] map = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List<String> res = new ArrayList<>();
String digits = "";
public List<String> letterCombinations(String str) {
if(str.equals("")) return res;
digits = str;
dfs(0,"");
return res;
}
public void dfs(int step,String s){
if(step == digits.length()){
res.add(s);return;
}
char tmpC = digits.charAt(step);
String letters = map[tmpC-'0'-2];
for(int i=0;i<letters.length();i++){
dfs(step +1 ,s+letters.charAt(i));
}
}
}
StringBuilder优化
class Solution {
private static Map<Integer, String> map = new HashMap<Integer, 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");
}
};
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return res;
}
dfs(new StringBuilder(), digits, 0, res);
return res;
}
public void dfs(StringBuilder sb, String digits, int n, List<String> res) {
if (n == digits.length()) {
res.add(sb.toString());
return;
}
int c = Integer.parseInt(String.valueOf(digits.charAt(n)));
String s = map.get(c);
for (int i = 0; i < s.length(); i++) {
sb.append(s.charAt(i));
dfs(sb, digits, n + 1, res);
sb.deleteCharAt(sb.length() - 1);
}
}
}
运行结果

2020年8月26日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
本文详细解析了电话号码转换为字母组合的算法实现,包括使用递归和StringBuilder优化的方法,展示了如何从数字2-9生成所有可能的字母组合。
898

被折叠的 条评论
为什么被折叠?



