力扣日记1.23-【回溯算法篇】17. 电话号码的字母组合

力扣日记:【回溯算法篇】17. 电话号码的字母组合

日期:2023.1.23
参考:代码随想录、力扣

17. 电话号码的字母组合

题目描述

难度:中等

给定一个仅包含数字 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’] 的一个数字。

题解

class Solution {
   
public:
#define SOLUTION 1
#if SOLUTION == 1
    // 映射
    vector<string> n2c_map = {
   "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    vector<string> results;
    string path;
    vector<string> letterCombinations(string digits) {
   
        if (digits == "") return results;
        backtracking(digits, 0);
        return results;
    }
    void backtracking(string digits, int index) {
   
        // 终止条件
        if (path.size() == digits.size()) {
    // index == size
            results.push_back(path);
            return;
        }
        size_t num = (digits[index]-'0') - 2;  // 将字符转换为数字,注意作为索引从0开始,0->2, 9->7
        // for 循环遍历集合(index记录当前遍历到digits第几个数字,集合长度即为该数字对应的字符个数)
        // index 在进入下一层递归时会+1,从而对下一个数字的字符集合进行遍历
        for (int i = 0; i < n2c_map[num].size(); i++) {
   
            // 处理节点
            path.push_back(n2c_map[num][i]);
            // 递归
            backtracking(digits, index + 1);
            // 回溯
            path.pop_back();
        }
    }
#endif
};

复杂度

  • 时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数
  • 空间复杂度: O(3^m * 4^n)

如对于输入"2379",2和3有三个字母,7和9有四个字母,则最多可遍历 3*3*4*4次(每个数字都能各自取3或4次并组合)

思路总结

  • 将问题转换为树形结构,并模拟遍历、递归回溯过程很有帮助

  • 在这里插入图片描述

  • 本题中,for循环每次要遍历的集合为某个数字对应的所有字符(如2对应"abc"),不同于之前的题目,递归不需要在当前集合上进行(即不需要通过递归在“abc"中连续取值,即求的是不同集合之间的组合),因此不需要startindex来记录起始位置

  • 至于递归,从当前层进入下一层递归,整个集合需要改变,即从digits的当前数字递归到其下一个数字对应的集合,因此通过一个n2c_map来表示数字到字母的映射,就可以通过index表示当前遍历到digits的第几个数字,并能获取该数字对应的字符集合;同时,每次进入递归时,在参数上传入index + 1,可自动对index进行回溯

  • 其他的则按照模板写就好了。

  • 注意:如果是现场面试,一定要考虑到异常情况(如输入”1 * #“等情况)的处理。

相关推荐

  1. 100】17.电话号码字母组合

    2024-01-27 01:50:02       34 阅读
  2. 17. 电话号码字母组合

    2024-01-27 01:50:02       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 01:50:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 01:50:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 01:50:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 01:50:02       20 阅读

热门阅读

  1. WordPress wp-file-manager 文件上传漏洞 CVE-2020-25213

    2024-01-27 01:50:02       30 阅读
  2. element中form校验中清除校验不通过的提示语

    2024-01-27 01:50:02       37 阅读
  3. 【Git】Conventional Commit提交规范

    2024-01-27 01:50:02       29 阅读
  4. [GN] Vue3.2 快速上手 ----常用API及其新组件

    2024-01-27 01:50:02       32 阅读
  5. CentOS7开机自动执行脚本

    2024-01-27 01:50:02       38 阅读
  6. 算法37:最大矩形(力扣84、85题)---单调栈

    2024-01-27 01:50:02       37 阅读
  7. KMean 聚类

    2024-01-27 01:50:02       36 阅读
  8. LED闪烁

    2024-01-27 01:50:02       30 阅读
  9. live555搭建流式rtsp服务器

    2024-01-27 01:50:02       39 阅读
  10. openssl3.2/test/certs - 075 - non-critical unknown extension

    2024-01-27 01:50:02       27 阅读
  11. Ubuntu环境vscode配置Log4cplus库

    2024-01-27 01:50:02       36 阅读