您的位置:首页 > 其它

[LeetCode系列]括号生成问题

2014-08-14 16:37 309 查看
给定n, 返回所有匹配的n对括号的可能形式. 如

给定 n = 3, 一个解集是:

"((()))", "(()())", "(())()", "()(())", "()()()"


本题解法的思路是

使用栈seq保存经历的字符串状态;

使用栈valid保存对应的字符串中有效的括号对个数;

当seq不为空时(即回溯未结束):

  当前的字符串和其中有效的括号对个数分别出栈;

  1. 如果字符串长度等于待求解的长度, 则将其加答案中;

  2. 如果字符串长度-有效括号对数小于最大括号对个数, 说明可以增加一个 "("; [有效括号对数代表已经放置的")", 这个差值代表已经放置的"("个数]

  3. 如果字符串长度大于成对的括号数, 说明需要加一个 ")", 并且有效括号对需要增加1; [说明有未配对的"("]

class Solution {
public:
vector<string> generateParenthesis(int n) {
if (n == 0) return vector<string> (0);
stack<string> seq;
stack<int> valid;
vector<string> ans;

seq.push("(");
valid.push(0);
while (!seq.empty()) {
string s = seq.top(); seq.pop();
int v = valid.top(); valid.pop();
if (s.length() == 2 * n) {
ans.push_back(s);
continue;
}
if (s.length() - v < n) {
seq.push(s + "(");
valid.push(v);
}
if (v * 2 < s.length()) {
seq.push(s + ")");
valid.push(v+1);
}
}
return ans;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: