LeetCode刷题日志(dfs(栈)):四

LeetCode-17-电话号码的字母组合

目录

LeetCode-17-电话号码的字母组合目录题目地址题目解析算法解析图形解释代码实现结果

题目地址

题目解析

  • 题目给定一个包含数字的字符串

  • 参考手机的数字输入键,2-9的数字都对应了几个英文字符

  • 需要返回对应的字符串可以表示的字母组合

  • 可以考虑使用dfs

算法解析

  • 考虑使用直接暴力枚举法(dfs),得到一个数字字符,调用遍历其字母表,并在遍历过程中遍历另一个数字字符的字母表,从而完成组合的过程

    • 使用map创建数字与字符串的映射关系(本题的映射比较简单,也可以通过数组来映射,这样是随机访问可能快一点)

    • 设计一个函数用于dfs,接收字符串的索引参数,在内部递归

图形解释

  • 以上是以digits == "23"绘制的遍历树,用循环实现同层遍历,用递归实现不同层遍历

  • 时间复杂度与树叶的个数有关(digits的长度为n,每个数字对应的字符串长度为m[i],i\in [0,n)) O(n \times \prod_{0}^{n-1}m[i])

代码实现

 
class Solution {
 private:
     string self_digits;             // 递归使用
     vector<string> mapping_vec;     
     vector<string> result_vec;
     string temp_result_str;    
 public:
     Solution(){
         this->mapping_vec = {" ","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
     }
     void combination(int index){
         // 递归出口 digits遍历结束
         if(index == this->self_digits.size()){
             // 将组合结果添加到结果列表中,然后清除临时字符串末尾字符
             this->result_vec.push_back(this->temp_result_str);
                
             return;
         }
         // 获取当前考察的数字
         int current_number = (int)this->self_digits[index] - '0';
         for(int i = 0;i<this->mapping_vec[current_number].size();++i){
             // 将映射表中考察到的字符加到临时字符串中
             this->temp_result_str.push_back(this->mapping_vec[current_number][i]);
             // 继续考察digits的下一位
             this->combination(index+1);
             this->temp_result_str.pop_back();
         }
     }
     vector<string> letterCombinations(string digits) {
         if(digits.empty()){
             return this->result_vec;
         }
         this->self_digits = digits;
         this->combination(0);
         return this->result_vec;
     }
 };

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学艺不精的Антон

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值