22. Generate Parentheses

January 24, 2017

22. Generate Parentheses

Description

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:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

Analysis

本题要求给出n对括号所组成的所有的well-formed的可能的括号排列。其实就是求让n对括号相互匹配的全排列。

很明显这种求全排列的题目肯定要利用回溯法,但是如何定义well-formed呢?即如何从n对括号的全排列中删除掉不符合题目要求的情况呢?这里提供一个思路:

每次递归时记录左右括号的数量,放置括号时,面临两种选择,要么放左括号要么放右括号;要求是,右括号不能比左括号少,左右括号数目都大于0,左右括号数目之和不能超过2*n。

算法的复杂度是O(结果的数量),因为卡特兰数并不是一个多项式量级的数字,所以算法也不是多项式复杂度的

只要满足上述要求,都将其加入结果之中即可,代码如下:

code

class Solution {
    void backtracking(vector<vector<int>> & res,vector<int> & temp,vector<int> & candidates,int remain,int start){
        if(remain<0)      return;
        if(remain==0){
            res.push_back(temp);
            return;
        }
        for(int i=start;i<candidates.size();++i){
            temp.push_back(candidates[i]);
            backtracking(res,temp,candidates,remain-candidates[i],i);
            temp.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum(vector<int> & candidates, int target) {
        vector<int> temp;
        vector<vector<int>> res;
        backtracking(res,temp,candidates,target,0);
        return res;
    }
};

此外,此题和卡特兰数有一些关系,即如果只是求解结果的组数,只需要将n带入卡特兰数公式即可。

北邮教务系统评教脚本

Published on September 17, 2017

72.Edit distance

Published on September 17, 2017