电话号码的字母组合
leetcode17. 电话号码的字母组合
难度 中等
leetcode17 跳转链接
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例1:输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例2:输入:digits = ""
输出:[]
示例 3:输入:digits = "2"
输出:["a","b","c"]
提示:0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
回溯算法
对于字符串 ds 中的每一位数字,都有其对应的字母映射数组。
在 DFS 中决策每一位数字应该对应哪一个字母,当决策的位数 i == n,代表整个 ds 字符串都被决策完毕,将决策结果添加到结果集:
回溯算法流程:1.路径:也就是已经做出的选择。
2.选择列表:也就是你当前可以做的选择。
3.结束条件:也就是到达决策树底层,无法再做选择的条件。
伪代码框架
java
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
代码演示
java
class Solution {
Map<String, String[]> map = 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"});
}};
ArrayList<String> ans = new ArrayList<>();
int n;
String _ds ;
public List<String> letterCombinations(String ds) {
n = ds.length();
if (n == 0){
return ans;
}
_ds = ds;
dfs(0,new StringBuilder());
return ans;
}
public void dfs(int index,StringBuilder sb){
if (index == n){
ans.add(sb.toString());
return;
}
String key = _ds.substring(index,index + 1);
String[] values = map.get(key);
//选择列表
for (String v : values){
//做出选择
sb.append(v);
//回溯
dfs(index + 1,sb);
//撤销选择
sb.deleteCharAt(sb.length() - 1);
}
}
}