import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param digits string字符串
     * @return string字符串一维数组
     */
    private List<String> res;
    private StringBuilder path;
    private final String[] letterMAP = {
        "",
        "",
        "abc",
        "def",
        "ghi",
        "jkl",
        "mno",
        "pqrs",
        "tuv",
        "wxyz"
    };

    public String[] letterCombinations(String digits) {
        res = new ArrayList<>();
        path = new StringBuilder();
        if (digits.length() == 0) return res.toArray(new String[0]);
        dfs(digits, 0);
        return res.toArray(new String[0]);
    }

    private void dfs(String digits, int u) {
        if (u == digits.length()) {
            res.add(path.toString());
            return;
        }

        for (char c : letterMAP[digits.charAt(u) - '0'].toCharArray()) {
            path.append(c);
            dfs(digits, u + 1);
            path.deleteCharAt(path.length() - 1);
        }
    }
}

使用的是Java语言。

该题考察的知识点是回溯算法。

代码的文字解释如下:

  1. 如果输入字符串digits为空,直接将结果列表转换为数组返回。
  2. 调用dfs方法开始深度优先搜索过程,并传递输入字符串digits和初始索引值0。
  3. dfs方法中,如果索引值等于输入字符串的长度,表示已经遍历完了所有的数字字符,将生成的字符串添加到结果列表中,并返回。
  4. 循环遍历当前数字对应的字符串中的每个字符。
  5. 将字符添加到path字符串的末尾。
  6. 递归调用dfs方法,将索引值加1,继续填充下一个位置的字符。
  7. 递归返回后,将path字符串末尾的字符删除,回到上一个状态,继续遍历下一个字符。
  8. 函数返回结果列表res,将其转换为数组形式返回。