leetCode Letter Combinations of a Phone Number

方法一:

  • 从digits 的第一字符开始遍历
  • 每次结果都是在之前的结果的基础上,加上当前数字可能的情况: 所以使用一个vector<string> result 存储每次加的结果;最开始为"";
  • 创建一个当前的结果vector<string> temp:要遍历result中的每一个并且遍历当前字符的所有可能,组成新的字符串,加入result vector 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
 
    vector<string> letterCombinations(string digits) {
 
 
        vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        vector<string> result;
        if(digits.size()==0)
            return result;
        result.push_back("");
        int k=digits.size();
         
        for(int i=0;i<k;i++)
        {
            int c=digits[i]-'0';
            if(c<0||c>9) break;
            cout<<c<<endl;
            vector<string>temp;
           for(int j=0;j<d[c].length();j++)
            {
               for(int m=0;m<result.size();m++)
               {
                  cout<<d[c][j]<<endl;
                  temp.push_back(result[m]+d[c][j]);
               }
 
            }   
            result=temp;
             
             
             
        }
        return result;
 
 
    }
};

  

方法二:

这道题类似之前的  遍历二叉树输出所有的路径的题。但是我太弱鸡,开始都没有用dfs做出来:

使用深度优先搜索:

  • 把最终结果当成dfs 的参数,因为一直要改变,所以是一个引用类型,定义一个参数存储当前拼成的字符串
  • dfs递归的终点,是这个数是最后一个数,
  • 每次迭代的时候,改变当前拼成的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void dfs(vector<string>& str,string save, string digits, int temp, int l)
   {
       vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
       if(temp==l)
       {
           str.push_back(save);
           return;
       }
            
       int c=digits[temp]-'0';
       int i=0;
       while(i<d[c].length())
       {
           cout<<d[c][i]<<endl;
  
           dfs(str,save+d[c][i],digits,temp+1,l);
 
           i++;
       }
        
   }
   vector<string> letterCombinations(string digits) {
       vector<string> str;
       if(digits.size()==0)
           return str;
       string save;
       
      dfs (str,save, digits,0, digits.size()) ;
       return str;
          

  

在递归传递的时候要主要:

1
dfs(str,save+d[c][i],digits,temp+1,l);<br>表示传入的参数为save+d[c][i], 而递归之前的save 没有改变;<br><br>如果使用

save.push_back(d[c][i]);
dfs(str,save+d[c][i],digits,temp+1,l);

save.pop();

如果改变了save, 还需要再变回来。

posted @   hahahaf  阅读(132)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示