LeetCode22.Generate Parentheses

来源:互联网 发布:mac os x lion系统 编辑:程序博客网 时间:2024/05/29 08:52

题目

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;    }};