回溯法 Generate Parentheses,第二次总结

class Solution {
public:
    vector<string> ans;
    
    void helper(string& cur, int left, int right, int n)
    {
        //首先两者都必须小于等于n
        //  not a must
        //这一行剪枝不是必须的,因为按照我们增长的规律,是不会出现非法字符串的。
        //if(left > n || right > n || left < right)
        //    return;
            
        if(left == n && right == n)  //左右相等,到终点了   ans数组在这里等你
        {
            ans.push_back(cur);
            return;
        }
        
        // 如果左侧比n小,可以添加左侧,也可以添加右侧
        if(left < n)
        {
            cur.push_back('(');
            helper(cur, left+1, right, n);
            cur.pop_back();
if(right < left) { cur.push_back(')'); helper(cur,left, right+1,n); cur.pop_back(); } } else // left == n { cur.push_back(')'); helper(cur, left ,right+1, n); cur.pop_back(); } } vector<string> generateParenthesis(int n) { string tmp; helper(tmp,0,0,n); return ans; } };

首先这是一个递归,回溯,在最深的地方判断,满足条件的话,就存储起来。

 

另外,一个容易忽略的点就是,为什么cur.push_back以后要pop_back?

因为是递归调用,你调用之后,不知道被修改成啥样了。如果每一个深度的函数,都能保证,自己这一层调用完之后,完璧归赵,那么...

 

需要再研究,这一块还有盲点。

 

上一篇:【LeetCode每天一题】Generate Parentheses(创造有效的括弧)


下一篇:【leetcode刷题】22. Generate Parentheses