Generate Parentheses

来源:互联网 发布:windows驱动器被锁定 编辑:程序博客网 时间:2024/05/18 00:21

【题目】

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对圆括号,求形成合法括号的所有组合。

【解析】

          用递归的方法,可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。需要特别注意的是剩余的右括号不能比左括号少,左括号右括号数量都要大于0。

        先放左括号,再放右括号,直到左右括号的数量均==n即可。注意:放括号的过程中,永远不能出现当前右括号的数量大于左括号数量的情况

      采用递归的思想,当左括号数大于右括号数时可以加左或者右括号,否则只能加左括号,当左括号数达到n时,剩下全部

   左右括号总数相同,且在填充时左括号的个数始终要大于等于右括号的个数。据此递归生成所有的括号对

1. Left代表余下的‘(‘的数目

2. right代表余下的‘)‘的数目

3. 注意right余下的数目要大于left,否则就是非法的,比如,先放一个‘)‘就是非法的。

4. 任何一个小于0,也是错的。

5. 递归的时候,我们只有2种选择,就是选择‘(‘还是选择‘)‘。

6. 递归的时候,一旦在结果的路径上尝试过‘(‘还是选择‘)‘,都需要回溯,


实现:

public class Solution {      public ArrayList<String> generateParenthesis(int n) {                 ArrayList<String> res = new ArrayList<String>();          generate(res, "", 0, 0, n);          return res;      }      public void generate(ArrayList<String> res, String tmp, int lhs, int rhs, int n)      {          if(lhs == n)          {              for(int i = 0; i < n - rhs; i++)              {                  tmp += ")";              }              res.add(tmp);              return ;          }          generate(res, tmp + "(", lhs + 1, rhs, n);          if(lhs > rhs)              generate(res, tmp + ")", lhs, rhs + 1, n);      }  }  


0 0