Leetcode:Generate Parentheses 生成卡特兰数解空间

关于卡特兰数,详见我的博文:http://www.cnblogs.com/wwwjieo0/p/3780170.html

Generate Parentheses

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:

 

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

解题分析:

这个题目就是 生成卡特兰数的解空间

可以拓展为 许多相关题,比如 2n个数(+1或者-1)的前导序列和均>=0 的解空间

小括号串是一个递归结构,跟单链表、二叉树等递归结构一样,首先想到用递归。
一步步构造字符串。

左括号出现次数< n时,就可以放置新的左括号。

右括号出现次数小于左括号出现次数时,就可以放置新的右括号

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        if (n == 0) return result;
        generate(n, "", 0, 0, result);
        return result;
    }
    
    void generate(int n, string s, int left, int right, vector<string>& result) {
        if (left == n) {
            result.push_back(s.append(n - right, ')'));  // 已有n个左括号,剩下的所有右括号一次性append
            return;
        }
        
        generate(n, s + '(', left + 1, right, result);   // left < n ,此时可以添置新的左括号
        if (right < left) {                              // left > right, 此时可以添置新的右括号,相当于和值一直>=0
            generate(n, s + ')', left, right + 1, result);
        }
    }
};

 

你可能感兴趣的:(LeetCode)