给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 image.png

    :::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、代码:
    自己实现的 :::

    1. class Solution {
    2. public List<String> letterCombinations(String digits) {
    3. if(digits.length() == 0){
    4. return new ArrayList<String>();
    5. }
    6. 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'}};
    7. int n = digits.length();
    8. char[][] arr = new char[n][3];
    9. for(int i=0; i < n; i++){
    10. arr[i] = chs[Integer.valueOf(digits.charAt(i))-50];
    11. }
    12. List<String> list = new ArrayList<>();
    13. StringBuilder sb = new StringBuilder();
    14. dfs(arr, 0, list, sb);
    15. return list;
    16. }
    17. private void dfs(char[][] arr, int raw, List<String> list, StringBuilder sb){
    18. if(raw == arr.length){
    19. list.add(sb.toString());
    20. sb = new StringBuilder();
    21. return;
    22. }
    23. for(int j=0; j<arr[raw].length; j++){
    24. sb.append(arr[raw][j]);
    25. dfs(arr, raw+1, list, sb);
    26. sb.delete(sb.length()-1, sb.length());
    27. }
    28. }
    29. }

    :::success 4、题解:

    :::