LeetCode 17.电话号码的字母组合(回溯)

80 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

17.电话号码的字母组合

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

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

image.png

示例 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'] 的一个数字。

二、思路分析

在看到这道题后,我是比较凌乱的。首先一个问题,这是有多个不同的集合,在每个集合中挑一个字母进行组合。那么k应该为digits的长度。但如何控制k呢?这么一想脑子就有些乱了。

这题我没做出来的地方也就在这里,之前的组合回溯题目都是在同一个集合里进行数字的挑选,那么k的控制也就是在每次递归的参数传递中使start为i+1即可。

然后我去看了就解析视频,才明白其实很简单,同样是设置了1个index,但这个index不同于之前的startindex,之前的startindex是为了记录每一次递归在集合中到哪个位置了。但这次的index记录的是到哪一个集合了。

同时我才知道原来字符串也可以使用pop_back和push_back。

三、AC代码

class Solution {
public:
    vector<string>ans;
    string path="";
    vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    
    void backtracking(string digits,int n,int start){
        if(path.size()==n){
            ans.push_back(path);
            return;
        }
        int digit=digits[start]-'0';
        string latter=board[digit];
        for(int i=0;i<latter .size();i++){
            path+=latter[i];
            backtracking(digits,n,start+1);
            path=path.substr(0, path.size()-1);
        }

    }

    vector<string> letterCombinations(string digits) {
        int n=digits.size();
        if(n==0){
            return ans;
        }
        backtracking(digits,n,0);
        return ans;
    }
};

四、总结

对回溯算法的理解又精进了一分。