ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

回溯算法练习——2、电话号码的字母组合(C++和Python描述)

2021-09-05 11:33:36  阅读:176  来源: 互联网

标签:digits index return Python res C++ 回溯 字母组合 path


来源:代码随想录
本题的力扣链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

目录

1、题目描述:

在这里插入图片描述
在这里插入图片描述

2、思路:

从示例上来看,输⼊"23",最直接的想法就是两层for循环遍历了吧,正好把组合的情况都输出了。
如果输⼊"233"呢,那么就三层for循环,如果"2333"呢,就四层for循环…

因此,这道题很明显用回溯法做,解决多层for循环嵌套问题。

接着,我们画一下树形图,来帮助我们理解。例如:输⼊:“23”,抽象为树形结构,如图所示:
在这里插入图片描述
图中可以看出遍历的深度,就是输⼊"23"的⻓度,⽽叶⼦节点就是我们要收集的结果,输出[“ad”, “ae”,“af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]。

写代码,使用回溯三部曲:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、代码:

3.1 python代码:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return []
        letterMap = [ # 字母映射
            "", # 0
            "", # 1
            "abc", # 2
            "def", # 3
            "ghi", # 4
            "jkl", # 5
            "mno", # 6
            "pqrs",# 7
            "tuv", # 8
            "wxyz" # 9
        ]
        res = [] # 保存结果集合
        path = "" # 收集路径上符合条件的结果
        def backtracking(index):
            """index表示第几个数字,也是树的高度"""
            nonlocal path
            if index == len(digits):
                res.append(path) # 收集叶子节点结果
                return
            digit = int(digits[index]) # 将index指向的数字转化为int
            letters = letterMap[digit] # 取数字对应的字符串
            for i in range(len(letters)):
                path += letters[i] # 处理
                backtracking(index+1) # 递归
                path = path[:-1] # 回溯(弹出最后一个)
        backtracking(0)
        return res

在这里插入图片描述

3.2 C++代码:

class Solution {
private:
    vector<string> res; // 存放树叶的结果集合
    string path; // 收集树路径上符合条件的集合
    const string letterMap[10] = {
        "", // 0
        "", // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs",// 7
        "tuv", // 8
        "wxyz" // 9
    };
    void backtracking(int index, string digits){
        if(index == digits.size()){
            res.push_back(path); // 叶子节点的结果存起来
            return;
        }
        int digit = digits[index] - '0'; // 将index指向的数字转为int
        string letters = letterMap[digit]; // 取数字对应的字符串
        for(int i = 0; i < letters.size(); i++){
            path.push_back(letters[i]); // 将树路径上的值保存
            backtracking(index+1, digits); // 递归
            path.pop_back(); // 回溯
        }
    }

public:
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0){
            return res;
        }
        backtracking(0, digits);
        return res;
    }
};

在这里插入图片描述

4、总结:

当确定一道题使用回溯法做时,我们首先可以把这个问题用N叉树画一下,以便加深理解。
其次,要记住:树的横向是用for循环遍历的,这个遍历就是指节点集合中的元素;而纵向是要使用递归的,这个要自身调用自身。
最后,一定要知道树的深度就是我们在if那里的条件判断。

加一个 回溯搜索算法模板:
在这里插入图片描述

标签:digits,index,return,Python,res,C++,回溯,字母组合,path
来源: https://blog.csdn.net/weixin_45901519/article/details/120111300

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有