把左右括号剩余的次数记录下来,传入回溯函数。
判断是否得到结果的条件就是剩余括号数是否都为零。
注意判断左括号是否剩余时,加上left>0的判断条件!否则会memory limited error!
判断右括号时要加上i==1的条件,否则会出现重复的答案。
同样要注意在回溯回来后ans.pop_back()
class Solution { public: void backTrack(string ans, int left, int right, vector<string>& res) { if(left==0 && right==0) { res.push_back(ans); } else { for(int i=0;i<2;i++) { if(i==0 && left>0) { ans.push_back('('); backTrack(ans,left-1,right,res); ans.pop_back(); } else { if(i == 1 && right>left && right>0) { ans.push_back(')'); backTrack(ans,left,right-1,res); ans.pop_back(); } } } } } vector<string> generateParenthesis(int n) { vector<string> res; string ans; backTrack(ans,n,n,res); return res; } };