题目
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
题目分析
题目意思是给定n对括号,要我们生成所有匹配的序列
题目是括号匹配,自然想到使用队列,一个未完全匹配的序列表示一个状态,队列存储状态,对于每次操作我们将队头的状态推出,然后根据这个状态左括号和右括号的个数生成后续状态,再放入队列。由于每个序列的长度都一定是2n,每次操作状态长度+1,因此每次队列元素全部弹出生成长度相同的下一状态的次数是2n。
后续状态的生成:左括号>右括号,左括号<n,增加左括号或右括号的后续状态
左括号>右括号,左括号=n,增加右括号的后续状态
左括号=0或者左括号=右括号,增加左括号的后续状态
c++代码
class Solution {
public:
vector<string> generateParenthesis(int n) {
queue<string> qu;
vector<string> res;
string a;
qu.push(a);
for (int i = 0; i < 2 * n; i++) {
int s = qu.size();
for (int j = 0; j < s; j++) {
string a = qu.front();
qu.pop();
int left = leftcount(a);
int right = rightcount(a);
if (left == 0||left == right) {
a += "(";
qu.push(a);
}
else if (left > 0&&left < n&&right < left) {
string b = a;
b += ")";
a += "(";
qu.push(a);
qu.push(b);
}
else {
a += ")";
qu.push(a);
}
}
}
int s = qu.size();
for (int i = 0; i < s; i++) {
string b = qu.front();
qu.pop();
res.push_back(b);
}
return res;
}
int leftcount(string a) {
int count = 0;
for (int i = 0; i < a.length(); i++) {
if (a[i] == '(') count++;
}
return count;
}
int rightcount(string a) {
int count = 0;
for (int i = 0; i < a.length(); i++) {
if (a[i] == ')') count++;
}
return count;
}
};