Featured image of post Letter Combinations of a Phone Number

Letter Combinations of a Phone Number

17. Letter Combinations of a Phone Number

分析

使用深度优先搜索(DFS)+ 回溯的方法。

  • 遍历数字字符串,按每个数字对应的字母集依次尝试:
    • 对当前数字的每个字母,将其加入组合路径中
    • 递归进入下一个数字,直到遍历完所有数字,将当前组合加入结果集
  • 回溯到上一步,尝试其他可能性

时间复杂度

数字字符串的长度为 n,每个数字对应最多 4 个字母。构造所有组合的时间复杂度为 O(4^n)

空间复杂度

  • 递归深度为 n,路径存储需要 O(n)
  • 结果集存储需要 O(4^n * n)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution
{
public:
    std::vector<std::string> res;          // 存储结果集
    std::string path;                      // 当前路径
    std::vector<std::string> strs = {      // 数字对应的字母集
        "", "", "abc",
        "def", "ghi", "jkl",
        "mno", "pqrs", "tuv", "wxyz"
    };

    vector<string> letterCombinations(string digits)
    {
        if (digits.empty())                // 特殊情况处理:空字符串
            return res;
        dfs(digits, 0);                    // 从第一个数字开始递归
        return res;
    }

    void dfs(std::string& digits, int u)
    {
        if (u == digits.size())
        {
            res.push_back(path);           // 将当前路径加入结果集
            return;
        }
        for (char c : strs[digits[u] - '0']) // 遍历当前数字对应的字母集
        {
            path.push_back(c);             // 将当前字母加入路径
            dfs(digits, u + 1);            // 递归到下一个数字
            path.pop_back();               // 回溯,移除最后一个字母
        }
    }
};
Built with Hugo
Theme Stack designed by Jimmy