今天就刷了一道力扣,一道中等难度的题,感觉力扣的题的顺序还是很良心的,做难的前面有个铺垫,各种数据结构掺杂着来,尽快熟悉一下。
这道题是括号的生成,是对上一道题检测括号是否正确的一个延伸,想了大概两个小时……
第一个思路,就是比较随意的适合小题目的,“随机法”生成再排除错误的答案。检查错误的直接用上一个的代码就好了吧,随机生成不如说是全排列,全排列的数目应该是小于随机生成的的,当然我觉得可能会超时,就没写下去。解题区第一个就是用的这个方法,但是不是C++,是python。随机产生的话,我觉得防在set里比较好,能排除相同元素。
第二个思路就是回溯法,之前就觉得这个很神奇,在百度C++排列组合问题时,看到了全排列用这个做的,于是想到这道题应该 也可以,然而并不能写出来。想了想就看了解答区的人的答案。
贴个别人的代码mark一下:
class Solution {
public:
vector<string>ans;
void backtrace(string temp,int n){
if(temp.length()==2*n){
ans.push_back(temp);
return;
}
if(left<n){
temp.push_back('(');
left++;
backtrace(temp,n);
left--;
temp.pop_back();
}
if(right<n&&right<left){
temp.push_back(')');
right++;
backtrace(temp,n);
right--;
temp.pop_back();
}
}
vector<string> generateParenthesis(int n) {
backtrace("",n);
return ans;
}
};
一位大大说的好,回溯法重要的是知道从哪退出,大概我目前没能力想出来出口在哪里……这段代码的意思就是,先生成所有的左括号,每增加一次backtrace一下,当left=n时,添加右括号,当左右都满了之后,开始终止当前层,回到上一层,删除一个右括号后再删除一个左括号,再在该层生成右括号,简言之就是“) (”这样的删除顺序,然后再添加相应数目的括号,凑齐2n,push_back一下,第一层完成后,推出回溯,进行输出。