class Solution {
public:
void generateParenthesis_aux(vector<int>& remainNum, stack<char>& stackPath,
string& path, vector<string>& ans)
{
if(remainNum[0] == 0 && remainNum[1] == 0)
{
ans.push_back(path);
return;
}
if(remainNum[0] > 0)//push '('
{
remainNum[0]--; path.push_back('('); stackPath.push('(');
generateParenthesis_aux(remainNum, stackPath, path, ans);
remainNum[0]++; path.pop_back(); stackPath.pop();
}
if(remainNum[1] > 0
&& !stackPath.empty()
&& stackPath.top() == '(')//pop '('
{
remainNum[1]--; path.push_back(')'); stackPath.pop();
generateParenthesis_aux(remainNum, stackPath, path, ans);
remainNum[1]++; path.pop_back(); stackPath.push('(');
}
}
vector<string> generateParenthesis(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
string path;
vector<string> ans;
vector<int> remainNum(2, n);
stack<char> stackPath;
generateParenthesis_aux(remainNum, stackPath, path, ans);
return ans;
}
};
second time
class Solution {
public:
void generateParenthesisUtil(int leftNum, int rightNum, string& curPath, stack<char>& curStack, vector<string>& allPaths)
{
if(leftNum == 0 && rightNum == 0 && curStack.size() == 0)
{
allPaths.push_back(curPath);
return ;
}
if(leftNum >= 1)
{
curPath.push_back('(');
curStack.push('(');
generateParenthesisUtil(leftNum-1, rightNum, curPath, curStack, allPaths);
curStack.pop();
curPath.pop_back();
}
if(rightNum >= 1 && curStack.size() >= 1)
{
curPath.push_back(')');
curStack.pop();
generateParenthesisUtil(leftNum, rightNum-1, curPath, curStack, allPaths);
curStack.push('(');
curPath.pop_back();
}
}
vector<string> generateParenthesis(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
string curPath;
stack<char> curStack;
vector<string> allPaths;
generateParenthesisUtil(n, n, curPath, curStack, allPaths);
return allPaths;
}
};