给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
:::info 1、规律:网格里面路径搜索类型中的一种,没有任何障碍,找到所有从第一行中每一个元素作为出发点,抵达最后一行的所有路径。也就是说,每一个路径中的元素由每一行中的任意一个元素组成。 ::: | | | | | —- | —- | —- | | | | | | | | | | | | | | | | |
:::danger
2、分析:深度优先遍历。
① 退层条件:当抵达最后一行,退层
② 对于第i层,遍历第i层
将第i层的第j个元素添加进字符串;
进入到i+1层;
从字符串中移除刚才添加的元素,才能进入到j+1的情况,因为对于每一条路径,都是同层中选一个。
:::
:::success
3、步骤:① 如果字符串为空,返回一个空列表。
② 创建并初始化二维字符数组,存储数字对应的字符,一维下标加2为数字。
③ 根据输入的字符串创建字符矩阵,遍历每一个字符,从二维字符数组中取出需要的字符数组。
④ 创建字符串列表,存储所有的路径;
⑤ 创建一个可变长的字符串,存储每一次的路径;
⑥ 递归实现深度优先遍历+回溯:
⑦ 递归返回值:由于所有的结果会存储在字符串列表中,所以返回值为空;
⑧ 形参列表:二维字符数组arr,行号raw,存储路径的字符串列表list,存储每一次路径的可变长字符串sb
⑨ 退层条件:当行号等于字符数组的长度时,将sb转为字符串,添加到list中,新建一个sb;
⑩ 对于当前raw行,遍历raw行的每一个字符:
⑪将arr[raw][j]添加到sb中
⑫进层:raw+1层
⑬ 从sb中删除刚刚添加的元素。
:::
:::info
4、代码:
自己实现的
:::
class Solution {public List<String> letterCombinations(String digits) {if(digits.length() == 0){return new ArrayList<String>();}char[][] chs = new char[][]{{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r', 's'}, {'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}};int n = digits.length();char[][] arr = new char[n][3];for(int i=0; i < n; i++){arr[i] = chs[Integer.valueOf(digits.charAt(i))-50];}List<String> list = new ArrayList<>();StringBuilder sb = new StringBuilder();dfs(arr, 0, list, sb);return list;}private void dfs(char[][] arr, int raw, List<String> list, StringBuilder sb){if(raw == arr.length){list.add(sb.toString());sb = new StringBuilder();return;}for(int j=0; j<arr[raw].length; j++){sb.append(arr[raw][j]);dfs(arr, raw+1, list, sb);sb.delete(sb.length()-1, sb.length());}}}
:::success 4、题解:
:::

