一、题目
给定一个仅包含数字 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)
