leetcode17:电话号码的字母组合

embedded/2024/12/24 11:05:16/

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

步骤1:定义计算问题性质

题目要求:给定一个数字字符串(仅包含 2-9),按照电话按键的字母映射,返回所有可能的字母组合。

  • 输入条件
    • 一个字符串 digits,仅包含字符 '2'-'9'。
    • 字符串长度范围是 0 <= digits.length <= 4。
  • 输出条件
    • 一个字符串列表,包含所有可能的字母组合。
    • 输出的顺序可以是任意顺序。
  • 边界条件
    • 输入字符串为空,输出应为空列表。
    • 如果输入仅包含一个数字,对应输出是该数字对应的字母组合。

步骤2:分解问题及最佳算法设计

问题分解

  1. 映射构建:定义数字到字母的映射关系。
  2. 回溯生成组合:使用回溯法(Backtracking)递归地生成所有组合。

逻辑说明

  • 电话键盘的映射关系是固定的,例如:
    • '2' -> ['a', 'b', 'c']
    • '3' -> ['d', 'e', 'f'] ...
  • 回溯法可以有效生成组合:
    • 从输入字符串的第一位开始处理,每处理一位数字时选择其中的一个字母,递归处理剩下的数字。
    • 当处理完最后一个数字时,生成一个完整组合。

时间复杂度

  • 映射构建的复杂度为 O(1)。
  • 假设输入长度为 nn 且每个数字对应最多 4 个字母,则组合总数为 4n4^n,回溯遍历所有组合的时间复杂度为 O(4n)O(4^n)。

空间复杂度

  • 主调用栈深度为输入字符串长度 nn,因此空间复杂度为 O(n)O(n)。

步骤3:C++实现代码

// 回溯辅助函数
void backtrack(const string& digits, int index, string& current, vector<string>& result, const vector<string>& mapping) {if (index == digits.size()) {result.push_back(current); // 当达到末尾,添加当前组合return;}// 获取当前数字对应的字母string letters = mapping[digits[index] - '0'];for (char letter : letters) {current.push_back(letter);      // 选择backtrack(digits, index + 1, current, result, mapping); // 递归current.pop_back();             // 撤销选择}
}vector<string> letterCombinations(string digits) {if (digits.empty()) return {}; // 特殊情况:空输入vector<string> mapping = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; // 数字到字母的映射vector<string> result;string current;backtrack(digits, 0, current, result, mapping);return result;
}

中文注释说明

  1. backtrack 函数是核心逻辑,通过递归逐步构建组合并存储结果。
  2. 使用 current 变量存储当前路径,回溯时动态更新。
  3. 数字到字母映射存储在 mapping 中,通过 digits[index] - '0' 获取对应字母列表。

步骤4:问题启发

  • 递归与回溯的威力:回溯法提供了高效的解决方案,适合于生成排列组合的问题。
  • 映射的巧妙设计:通过映射表减少条件判断的复杂性,使得逻辑更加直观。

步骤5:实际生活中的应用

算法与自动生成所有可能的排列组合有关,可以用于以下场景:

  • 短信生成:输入一组数字自动生成候选短信内容。
  • 自动化测试:生成测试数据,用于覆盖所有可能的输入组合。

具体应用示例

  • 营销短信生成
    • 假设公司提供不同产品优惠,通过字母组合生成多种短信内容。例如输入数字 '23',表示促销两个产品(对应 "abc" 和 "def")。每种组合代表一种短信模板,算法可以快速生成候选短信内容以供人工筛选。

http://www.ppmy.cn/embedded/148313.html

相关文章

JDK11下载安装和配置超详细过程

一、下载JDK11资源包 JDK11安装包文件夹资源资源https://download.csdn.net/download/Z0412_J0103/90160803 二、配置环境 2.1 找到文件位置 2.2 打开文件&#xff0c;点击“下一步” ” 2.3 记住文件配置路径&#xff0c;并不要更改&#xff0c;点击下一步 2.4 等待安装完…

【Prometheus】【实战篇(七)】在 Grafana 中配置数据源并使用 Prometheus Node Exporter

目录 1、配置 Prometheus 数据源2、导入 Node Exporter 仪表盘3、查看Dashbords监控数据4、通过JSON文件离线方式导入仪表盘4.1、访问grafana的官网下载配置文件4.2、将对应的文件内容填充到如下 5、总结 1、配置 Prometheus 数据源 登录到 Grafana 打开浏览器&#xff0c;访问…

express+mysql实现注册功能

这里写自定义目录标题 app.jsregister.htmlsuccess.html初始化项目mysql app.js const express require("express"); const bodyParser require("body-parser"); const mysql require("mysql"); const path require("path"); con…

Redis 多实例配置说明

Redis 多实例就是在在单个服务器上运行多个redis服务&#xff08;通过不同的配置文件来启动不同的redis进程&#xff09;。 所以需要保证以下配置项在当前服务器上唯一。 监听端口&#xff1a; port PID文件&#xff1a; pidfile 日志文件 &#xff1a;logfile 持久化数据的…

【Linux】ubuntu通过远程命令行启动桌面应用

背景介绍 我有一台服务器&#xff0c; 但没有外接鼠标和键盘。 安装了驱动和桌面程序&#xff0c; 连接到了显示器大屏。 配置了固定的ip地址和ssh服务。 目的 想在服务器上开启浏览器显示在大屏上。 如何通过ssh命令来实现这呢 具体代码 export DISPLAY:0.0 …

数据结构_平衡二叉树

结点类 构造函数分为有参和无参&#xff0c;相同点都是初始化树高为1 class Node { public:int data; // 用于输出int val; // 数据域&#xff0c;用于排序int height; // 树高Node* left;Node* right;Node();Node(int v, int d);static int max(int a, int b); };Node::N…

小程序租赁系统的优势与未来发展潜力分析

内容概要 小程序租赁系统正在成为租赁行业的热门工具&#xff0c;大家都在谈论它的优势和未来潜力。让我们简单分析一下这些优势&#xff1a; “便捷性和高效性是小程序租赁系统的两个杀手锏&#xff0c;让我们一起揭开它们的神秘面纱&#xff01;” 在许多情况下&#xff0c;…

Elasticsearch相关知识@1

目录标题 Lucene1. **什么是 Lucene?**2. **Lucene 在 Elasticsearch 中的作用**3. **Lucene 的核心功能**(1) **倒排索引**(2) **分词**(3) **查询解析**(4) **相关性评分** 4. **为什么 Elasticsearch 使用 Lucene?**5. **Lucene 和 Elasticsearch 的区别**6. **总结** 分片…