回溯 组合问题(三)

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 @ 2022-10-12 16:18  JaydenHuan  阅读(24)  评论(0编辑  收藏  举报