leetcode 784. Letter Case Permutation(c++) 学习笔记

leetcode 784. Letter Case Permutation 学习笔记


用递归的思路

参考一篇用递归求解的博客,https://blog.csdn.net/Snow_Jie/article/details/80916287. 这个递归类似于二叉树的递归。二叉树的递归是每次生成两支,一支左,一支右。这道题递归思路也类似,每个字母可以分成两支,一支大写,一支小写。

class Solution {
public:
    void backtrade(vector<string>& res,string S,int i)
    {
        //如果到字符的最后一个,那么就退出
        if(i > S.length())
        {
            res.push_back(S);
            return;
        }
        if(S[i] >= 'a'&&S[i]<= 'z')
        {       
            S[i] -= 32;
            backtrade(res,S,i+1);
            S[i] += 32;
        }
        if(S[i] >= 'A'&&S[i]<= 'Z')
        {       
            S[i] += 32; 
            backtrade(res,S,i+1);  
            S[i] -= 32;
        }    
        backtrade(res,S,i+1);   
    }
    vector<string> letterCasePermutation(string S) {
        vector<string> result;
        backtrade(result,S,0);
        return result;
    }
};
--------------------- 
作者:Snow_Jie 
来源:CSDN 
原文:https://blog.csdn.net/Snow_Jie/article/details/80916287 
版权声明:本文为博主原创文章,转载请附上博文链接!

有些要点需要注意下:
递归函数backtrade不应该有返回值,返回值为void,想要保存结果应该使用“传引用”的方式,即在参数传递时使用取地址符号。当在递归函数内调用该函数时,括号内无取地址符号,在主函数内调用该函数时,也不用取址符号。

改写代码:
理解了递归之后,在原代码的基础上,自己试着改了一下,让每次分支之前不必先大小写取反,就是说 “分支-取反-再分支”,代码如下:

class Solution {
public:
    void backtrade(vector<string> &res, string S, int i){
        
        if(i>S.length()){
            res.push_back(S);
            return;
        }
        
        if(S[i]>='a'&& S[i]<='z'){
            backtrade(res,S,i+1);
            S[i] -= 32;
            backtrade(res,S,i+1);
            S[i] +=32;
            
        }
        
         if(S[i]>='A'&& S[i]<='Z'){
            backtrade(res,S,i+1);
            S[i] += 32;
            backtrade(res,S,i+1);
            S[i] -=32;
         }
        
        if(S[i]<'A'|| S[i]>'z'){
            backtrade(res,S,i+1);
        }     
        
    }
 
    vector<string> letterCasePermutation(string S) {
        vector<string> result;
        backtrade(result,S, 0);
        return result;
        
    }
};

原代码的运行时间是8ms,改进后的代码的运行时间是4ms,时间上而言更快了一点。
运行时间更快了
vector初始化的注意事项:
letter 是string,不能直接将它放入vector的初始化;

//正确的
vector<string> result;
result.push_back(letter);
//错误的
vector<string> result(letter);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值