算法学习之树形问题

Jackey C/C++ 1,846 次浏览 , 没有评论

题目要求:

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

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

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:

输入:digits = ""
输出:[]
示例 3:

输入:digits = "2"
输出:["a","b","c"]
提示:

0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number

解题代码:

class Solution {
private:
    const string letterMap[10] = {
            " ", // 0
            "", // 1
            "abc", // 2
            "def", // 3
            "ghi", // 4
            "jkl", // 5
            "mno", // 6
            "pqrs", // 7
            "tuv", // 8
            "wxyz", // 9
    };
    vector<string> res;

    // s中保存了此时从digits[0...index-1]翻译得到的一个字母字符串
    // 寻找和digits[index]匹配的字母,获得digits[0...index]翻译得到的解
    void findCombination(const string &digits, int index, const string &s) {
        if (index == digits.size()) {
            // 保存s
            res.push_back(s);
            return;
        }

        char c = digits[index];
        assert(c >= '0' && c <= '9' && c != 1);
        string letters = letterMap[c - '0'];
        for (int i = 0; i < letters.size(); ++i) {
            findCombination(digits, index + 1, s + letters[i]);
        }
        return;
    }

public:
    vector<string> letterCombinations(string digits) {
        res.clear();
        if (digits == "")
            return res;

        findCombination(digits, 0, "");
        return res;
    }
};

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Go