Generate Parentheses

来源:互联网 发布:fifa2017曼联球员数据 编辑:程序博客网 时间:2024/05/17 07:18

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到2n个位置都满足如下规则:左括号的个数大于等于右括号的个数。所以,我们就可以按照这个规则去打印括号:假设在位置k我们还剩余left个左括号和right个右括号,如果left>0,则我们可以直接打印左括号,而不违背规则。能否打印右括号,我们还必须验证left和right的值是否满足规则,如果left>=right,则我们不能打印右括号,因为打印会违背合法排列的规则,否则可以打印右括号。如果left和right均为零,则说明我们已经完成一个合法排列,可以将其打印出来。通过深搜,我们可以很快地解决问题,针对n=2,问题的解空间如下:


按照这种思路,代码如下:

void generate(int leftNum,int rightNum,string s,vector<string> &result)      {          if(leftNum==0&&rightNum==0)          {              result.push_back(s);          }          if(leftNum>0)          {              generate(leftNum-1,rightNum,s+'(',result);          }          if(rightNum>0&&leftNum<rightNum)          {              generate(leftNum,rightNum-1,s+')',result);          }  }  



本题java版具体代码如下

public class Solution {    public List<String> generateParenthesis(int n) {        if(n<0) return null;        int left = n;        int right = n;        String s = "";                List<String> list = new ArrayList<String>();         genera(left,right,list,s);         return list;    }        public void genera(int left,int right,List list,String s) {                if(left==0 && right==0) {            list.add(s);        }                 if(left>0) {                        genera(left-1,right,list,s+"(");        }        if(left<right && right>0) {                       genera(left,right-1,list,s+")");        }    }}
其中left表示剩余的左括号的个数,即未加入到字符串s里的左括号的个数。在left大于0,且left<right的情况下,每一次递归都有2条路径,代表了2中不同的自合形式,当left=0后每一次递归只剩下一条路径(只剩下右括号可以加入到字符串中),当left>right时,每一次递归也只剩下一条路径(此时必须右括号加入字符串中)

参考:http://blog.csdn.net/yutianzuijin/article/details/13161721

0 0
原创粉丝点击