• 【回溯算法】leetcode 17. 电话号码的字母组合


    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 < = d i g i t s . l e n g t h < = 4 0 <= digits.length <= 4 0<=digits.length<=4
    • d i g i t s [ i ] 是范围 [ ′ 2 ′ , ′ 9 ′ ] 的一个数字。 digits[i] 是范围 ['2', '9'] 的一个数字。 digits[i]是范围[2,9]的一个数字。

    方法:回溯算法

    解题思路

    这里定义一个字符串数组用来将数字映射到对应的字母。

    const string letterMap[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    
    • 1

    回溯三部曲:

    • 确定回溯函数参数
      首先需要一个字符串 path 来收集叶子结点的结果,然后用一个字符串数组 result 来收集所有结果。这两个变量定义为全局。

      再来看参数,参数指定是有题目中给的 string digits,然后还要有一个参数就是 int 型的 index。

      这个 index 是记录遍历第几个数字了,就是用来遍历 digits 的(题目中给出数字字符串),同时 index 也表示树的深度。

      const string letterMap[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
      vector<string> result;
      string path;
      void dfs(int index, const string& digits)
      
      • 1
      • 2
      • 3
      • 4
    • 确定终止条件
      终止条件就是如果 index 等于 输入的数字个数(digits.size)了(本来index 就是用来遍历 digits 的)。然后收集结果,结束本层递归。

      	if(index == digits.size()) {
              result.push_back(path);
              return;
          };
      
      • 1
      • 2
      • 3
      • 4
    • 确定单层遍历逻辑
      首先要取 index 指向的数字,并找到对应的字符集(手机键盘的字符集)。本题每一个数字代表的是不同集合,也就是求不同集合之间的组合。然后 for 循环来处理这个字符集,代码如下:

      	int digit = digits[index] - 48;
          string letters = letterMap[digit];
          for(int i = 0; i < letters.size(); i++) {
              path.push_back(letters[i]);
              dfs(index + 1, digits);
              path.pop_back();
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    代码

    class Solution {
    public:
        const string letterMap[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<string> result;
        string path;
        void dfs(int index, const string& digits) {
            if(index == digits.size()) {
                result.push_back(path);
                return;
            };
            int digit = digits[index] - 48;
            string letters = letterMap[digit];
            for(int i = 0; i < letters.size(); i++) {
                path.push_back(letters[i]);
                dfs(index + 1, digits);
                path.pop_back();
            }
        }
        vector<string> letterCombinations(string digits) {
            if(digits.size() == 0)  return result;
            dfs(0, digits);
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    Redis 持久化
    ubuntu18.04服务器双网口配置上外网
    赶紧进来看看---C语言实现学生信息管理系统(3.0文件存储版)
    大数据-Storm流式框架(一)
    CLion使用相关问题
    zabbix监控
    7月第3周榜单丨飞瓜数据B站UP主排行榜发布!
    【2023集创赛】平头哥杯一等奖作品:基于无剑100开源SoC平台构建双核TEE安全系统
    ncnn之三(补充):window环境下vs2022安装ncnn+protobuf
    第三章:人工智能深度学习教程-基础神经网络(第六节-ML深度学习层列表)
  • 原文地址:https://blog.csdn.net/lele_ne/article/details/126753772