回溯 组合问题(三)

leetcode 17

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

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

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

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

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

本题思路

因为还是根据所给定的字符串中表示字母的组合,所有考虑可以用回溯三部曲,来解决。

返回值与参数

因为本题与之前的组合不太一样,不只是单纯的取出数字,还要根据数字对应的字母,进行组合,所以,可以考虑数字与字母的映射,定义一个二维数组:

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

用字符串s来收集叶子节点的结果,同时保存在result中;参数设定一个int类型的index,记录遍历到第几个数字,同时也表示树的深度。

vector<string> result;
string s;
void backtracking(const string& digits,int index)

终止条件

当输入为“23”,根节点向下递归两层就可以了,叶子节点就是要收集的结果集。终止条件就是如果index等于输入的两个数,就收集结果,结束本层递归。

if(index==digits.size())
{
    result.push_back(s);
    return;
}

递归

单层遍历逻辑,首先获取下标index指向的数字,并找到对应的字符集(手机键盘的字符集)。然后用for循环处理这个字符集:

int digit = digits[index] - '0'; //index指向的数字转为int类型
        string letters = letterMap[digit]; //从获取数字对应的字符集
        for (int i = 0;i < letters.size();i++)
        {
            s.push_back(letters[i]);
            backtracking(digits,index + 1);
            s.pop_back();
        }

整体代码

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
    };
public:
    vector<string> result;
    string s;
    void backtracking(const string& digits,int index)
    {
        if (index == digits.size())
        {
            result.push_back(s);
            return;
        }
        int digit = digits[index] - '0'; //将index指向的数字转为int类型
        string letters = letterMap[digit]; //从获取数字对应的字符集
        for (int i = 0;i < letters.size();i++)
        {
            s.push_back(letters[i]);
            backtracking(digits,index + 1);
            s.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        s.clear();
        result.clear();
        if(digits.size() == 0)
        {
            return result;
        }
        backtracking(digits,0);
        return result;
    }
};
posted @   JaydenHuan  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示