【力扣-回溯】2、电话号码的字母组合(17)

「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

17. 电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
复制代码

示例 2:

输入: digits = ""
输出: []
复制代码

示例 3:

输入: digits = "2"
输出: ["a","b","c"]
复制代码

解析

回溯法

  • 首先需要一个字符串数组vector<string> result来存放结果,同时还需要一个字符串s来存放叶子结点的值
  • 确定递归函数的参数和返回值
    • 参数:字符串,指向数字的索引(用来统计访问到第几个数,index在这里该表示树的深度)
  • 确定终止条件
    • 如果index 等于输入的数字个数digits.size(),则将s添加到结果集result
  • 确定单层循环的逻辑
    • 取Index指向的数字,找到对应的字符串
    • for循环处理这个字符串

代码

class Solution
{
public:

    vector<string> letterCombinations(string digits)
    {
        if (digits == "")
        {
            return result;
        }
        backtracking(digits,0);
        return result;
    }

private:
    // 结果集
    vector<string> result;
    // 记录叶子节点
    string s;
    // 定义数字和字符串的映射
    const string letterMap[10] = {
        "",     //0
        "",     //1
        "abc",  //2
        "def",  //3
        "ghi",  //4
        "jkl",  //5
        "mno",  //6
        "pqrs", //7
        "tuv",  //8
        "wxyz", //9

    };
    // 这里的index不是 组合问题里面的 startIndex
    // index指向数字,表示遍历到第几个数字了,还表示树的深度
    void backtracking(const string &digits, int index)
    {
        // Index等于字符串的大小时
        if (index == digits.size())
        {
            result.push_back(s);
            return;
        }

        // 将index指向的数字转换成int类型
        int digit = digits[index] - '0';
        // 取出数字对应的字符串
        string letter = letterMap[digit];
        // 对字符串进行遍历
        for (int i = 0; i < letter.size(); i++)
        {
            s.push_back(letter[i]);
            // 下一层处理下一个数字
            backtracking(digits, index + 1);
            s.pop_back(); // 回溯
        }
    }
};
复制代码

猜你喜欢

转载自juejin.im/post/7033569163213799454