问题描述
解题报告
- 方法一
最朴实的做法就是将所有的的序列枚举出来,然后判断该序列是否满足合法的字符串的要求 - 方法二【参考官网题解】
采用回溯的方法,在生成字符串序列时就判断是否满足合法字符串的要求;
左括号的产生不受右括号的限制,只受到数量的限制;
右括号除了自己的限制以外,还受到左括号的限制,即:右边剩余可以使用的括号数量一定得严格大于左边剩余的数量的时候,才可以递归。
即可以在方案一的基础上加上
if(close<max&&close<open)
来实现。
实现代码
- 方法一
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string>ans;
bracket("",ans,0,0,n);
return ans;
}
void bracket(string target, vector<string>&ans,int open,int close,int max){
if(close==max&&open==max){
if(judge(target))
ans.push_back(target);
return;
}
if(open<max)
bracket(target+'(',ans,open+1,close,max);
if(close<max)
bracket(target+')',ans,open,close+1,max);
}
// 判断是否是合法字符串
bool judge(string str){
stack<char>s;
int size=str.size();
for(int i=0;i<size;i++){
if(str[i]=='(') s.push(str[i]);
else if(s.empty()) return false;
else s.pop();
}
if(s.empty()) return true;
else return false;
}
};
- 方法二
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string>ans;
bracket("",ans,0,0,n);
return ans;
}
void bracket(string target, vector<string>&ans,int open,int close,int max){
if(close==max&&open==max){
ans.push_back(target);
return;
}
if(open<max)
bracket(target+'(',ans,open+1,close,max);
if(close<max&&close<open)
bracket(target+')',ans,open,close+1,max);
}
};