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?
因为是递归调用,你调用之后,不知道被修改成啥样了。如果每一个深度的函数,都能保证,自己这一层调用完之后,完璧归赵,那么...
需要再研究,这一块还有盲点。