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);