Given
n
pairs of parentheses, write a function to generate all combinations of well-formed parentheses.Input: n = 3 Output: ["((()))","(()())","(())()","()(())","()()()"]
We are dfs on a search tree. Well-formed parentheses have to fulfill 2 conditions. the number of opening and closing parentheses needs to be the same and the bottom of the stack cannot be closing parentheses.
what does the bottom of the stack mean?
we suggest that opening and closing parentheses can be mutually canceled. If the string uses the closing parentheses ahead, that must be an invalid combination.
here are some example: ['())' , ')(()(']
The search tree would look like the above image!
Only if the dfs go to the bottom of the search tree and fulfill the requirement that the number of the opening and closing parentheses are the same and the number of opening parentheses equals N.
How to avoid searching the invalid case? By adding some if conditions.
class Solution {
public:
void dfs(vector<string> &arr, int n, int open, int close, string s){
//reach to the bottom of the search tree
if(open == n && close == open){
arr.push_back(s);
return;
}
//if opening parentheses are reach to the required n.
if(open < n){
dfs(arr, n, open + 1, close, s + '(');
}
//to make sure the closing paretheses are the same with the opening parentheses
if(close < open){
dfs(arr, n, open, close + 1, s + ')');
}
}
vector<string> generateParenthesis(int n) {
vector<string> res;
dfs(res, n, 0, 0, "");
return res;
}
};