一、题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
点击查看原题
难度级别:中等
二、思路
1)回溯法
将每个数字位对应的字符看作树的多个分支,那么本题的思路就变成了多叉树的dfs
,当遍历到叶子节点时,记录下根到叶子节点的路径
三、代码
1)回溯法
class Solution {
private List<List<Character>> mapping = new ArrayList(); // 用list记录数字对应的字母
List<String> ans;
public Solution() {
mapping.add(new ArrayList(Arrays.asList('a', 'b', 'c')));
mapping.add(new ArrayList(Arrays.asList('d', 'e', 'f')));
mapping.add(new ArrayList(Arrays.asList('g', 'h', 'i')));
mapping.add(new ArrayList(Arrays.asList('j', 'k', 'l')));
mapping.add(new ArrayList(Arrays.asList('m', 'n', 'o')));
mapping.add(new ArrayList(Arrays.asList('p', 'q', 'r', 's')));
mapping.add(new ArrayList(Arrays.asList('t', 'u', 'v')));
mapping.add(new ArrayList(Arrays.asList('w', 'x', 'y', 'z')));
}
public List<String> letterCombinations(String digits) {
if (digits == null || digits.length() == 0) {
return new ArrayList();
}
ans = new ArrayList();
StringBuilder temp = new StringBuilder();
dfs(temp, digits.toCharArray(), 0);
return ans;
}
public void dfs(StringBuilder temp, char[] cs, int loc) {
if (loc == cs.length) { // 出口条件
ans.add(temp.toString());
return ;
}
for (char c : mapping.get(cs[loc] - '2')) {
temp.append(c);
dfs(temp, cs, loc + 1);
temp.deleteCharAt(temp.length() - 1);
}
}
}
m
是digits
中对应3
个字母的数字个数,n
是digits
中对应4
个字母的数字个数,时时间复杂度为O(3``m``_*_4``n``)
,空间复杂度为O(m+n)