leetCode Letter Combinations of a Phone Number

方法一:

  • 从digits 的第一字符开始遍历
  • 每次结果都是在之前的结果的基础上,加上当前数字可能的情况: 所以使用一个vector<string> result 存储每次加的结果;最开始为"";
  • 创建一个当前的结果vector<string> temp:要遍历result中的每一个并且遍历当前字符的所有可能,组成新的字符串,加入result vector 中
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递归的终点,是这个数是最后一个数,
  • 每次迭代的时候,改变当前拼成的字符串
 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;
           

  

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

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

如果使用

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

save.pop();

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

转载于:https://www.cnblogs.com/fanhaha/p/7286056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值