当前位置: 首页 > news >正文

Letter Combination of a Phone Number

Introduce

在这里插入图片描述

Problem Analysis (Using “258” as example)

//2   a    b    c
//5   j    k    l
//8   t    u    v

Possible letter combinations:

  • a, j, t (no further options, this is one combination)
  • a, j, u (no further options, another combination)
  • a, j, v (another combination)
  • a, k, t (another combination)

this resembles a depth-first search (DFS) traversal of an n-ary tree.

Solution Approach

To traverse all combinations starting with ‘a’, we need to traverse all subtrees rooted at ‘j’, ‘k’, and ‘l’ (the next level letters for digit ‘5’)

Similarly, to traverse combinations starting with ‘j’, we need to traverse subtrees rooted at ‘t’, ‘u’, and ‘v’ (the next level letter for digit ‘8’)

Recursive implementation

class Solution {
public:vector<string> letterCombinations(string digits) {}
};

We`ll implement a recursive solution:

class Solution {
public:void _letterCombinations(string digits){}vector<string> letterCombinations(string digits) {}
};

Digit-to-Letter Mapping

Since we`re dealing with digit 2-9, we can store the corresponding letters in an string array for O(1) lookup:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:void _letterCombinations(string digits){}vector<string> letterCombinations(string digits) {}
};

Tree Traversal Implementation

Now we implement the traversal starting from digits[0]:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:// Traverse all subtrees at level ivoid _letterCombinations(string digits, int i){// Get corresponding lettersstring str = tele[digits[i] - '0'];for (int j = 0; j < str.size(); j++) {// Traverse next level_letterCombinations(digits, i + 1);}}vector<string> letterCombinations(string digits) {// Start traversal from level 0_letterCombinations(digits, 0);}
};

Adding Recursion Boundary Condition

we must add a termination condition for the recursion:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:// Traverse all subtrees at level ivoid _letterCombinations(string digits, int i){// Recursion boundaryif (i == digits.size()) {return;}// Get corresponding lettersstring str = tele[digits[i] - '0'];for (int j = 0; j < str.size(); j++) {// Traverse next level_letterCombinations(digits, i + 1);}}vector<string> letterCombinations(string digits) {// Start traversal from level 0_letterCombinations(digits, 0);}
};

Storing Results

We need to store the combinations in a vector:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:// Traverse all subtrees at level ivoid _letterCombinations(string digits, int i, vector<string>& ret){// Recursion boundaryif (i == digits.size()) {return;}// Get corresponding lettersstring str = tele[digits[i] - '0'];for (int j = 0; j < str.size(); j++) {// Traverse next level_letterCombinations(digits, i + 1, ret);}}vector<string> letterCombinations(string digits) {vector<string> result;// Start traversal from level 0_letterCombinations(digits, 0, result);return result; // Don't forget to return!}
};

Building Combinations

We need to build the combinations by passing the current combination down the recursion:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:// Traverse all subtrees at level ivoid _letterCombinations(string digits, int i, string current, vector<string>& ret){// Recursion boundaryif (i == digits.size()) {ret.push_back(current);return;}// Get corresponding lettersstring str = tele[digits[i] - '0'];for (int j = 0; j < str.size(); j++) {// Traverse next level with updated combination_letterCombinations(digits, i + 1, current + str[j], ret);}}vector<string> letterCombinations(string digits) {vector<string> result;string current;// Start traversal from level 0_letterCombinations(digits, 0, current, result);return result;}
};

Edge Case Handling

Finally, we handle the empty input case:

class Solution {string tele[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
public:// Traverse all subtrees at level ivoid _letterCombinations(string digits, int i, string current, vector<string>& ret){// Recursion boundaryif (i == digits.size()) {ret.push_back(current);return;}// Get corresponding lettersstring str = tele[digits[i] - '0'];for (int j = 0; j < str.size(); j++) {// Traverse next level with updated combination_letterCombinations(digits, i + 1, current + str[j], ret);}}vector<string> letterCombinations(string digits) {vector<string> result;if (digits.empty()) {return result;}string current;// Start traversal from level 0_letterCombinations(digits, 0, current, result);return result;}
};
http://www.dtcms.com/a/287098.html

相关文章:

  • Redis原理之集群
  • windows内核研究(驱动开发之内核编程)
  • Qt控件实战详解:深入掌握输入输出与数据展示
  • Python MCP与Excel增强智能:构建下一代数据处理和自动化解决方案
  • SpringBoot 3.0 挥别 spring.factories,拥抱云原生新纪元
  • 人该怎样活着呢?55
  • 【RK3576】Android 14 驱动开发实战指南
  • uview-ui使用u-icon文字图标展示
  • 报错:升级gcc,centos
  • 数据库第五次作业
  • 云边端协同架构下的智能计算革命
  • 从代码学习深度强化学习 - SAC PyTorch版
  • 消息队列与信号量:System V 进程间通信的基础
  • 【机器学习深度学习】为什么要将模型转换为 GGUF 格式?
  • win10连接鼠标自动关闭触摸板/win10关闭触摸板(笔记本)
  • 路由器的Serial 串口理解
  • 移除debian升级后没用的垃圾
  • 爬虫逆向之JS混淆案例(全国招标公告公示搜索引擎 type__1017逆向)
  • AJAX概述
  • Unity 3D碰撞器
  • C语言—深入理解指针(详)
  • Eureka 和 Nacos
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(下)
  • Acrobat SDK 核心架构、应用
  • 2025年最新秋招java后端面试八股文+场景题
  • Linux操作系统之线程(三)
  • 动态规划算法的欢乐密码(三):简单多状态DP问题(上)
  • VBA 运用LISTBOX插件,选择多个选项,并将选中的选项回车录入当前选中的单元格
  • 【Linux系统】进程控制
  • 高效适配多分辨率!Unity动态UI缩放工具 Resize Pro 免费分享