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:

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

思路:该题目进行转换,n个括号匹配。其实可以看做n个左括号和n个右括号,每次放一个括号。

每次可以有两种选择,左括号或者右括号,共放2n个。需要满足条件:放置的(数要不小于放置的)数。 是一道DFS题目

思路二: 2n个(和)排序,然后挑选满足条件的排列。时间复杂度过高。 也考虑考虑用栈实现,每次压入满足条件的(或者)括号。

java代码:

  1. List<String> res = new ArrayList<String>();
  2. void generateHelper(int left,int right,String cur) {
  3. if(left>right) return;
  4. if(right==0) {
  5. res.add(new String(cur));
  6. return;
  7. }
  8. if(left>=1) generateHelper(left-1,right,cur + '(');  //用临时变量,返回值恢复原值
  9. if(right>=1) generateHelper(left,right-1,cur + ')');
  10. }
  11. public List<String> generateParenthesis(int n) {
  12. if(n==0) return res;
  13. String cur = "";
  14. generateHelper(n,n,cur);
  15. return res;
  16. }

如果用StringBuffer,则

  1.      List<String> res = new ArrayList<String>();
  2. void generateHelper(int left,int right,StringBuffer cur) {
  3. if(left>right) return;
  4. if(right==0) {
  5. res.add(new String(cur));
  6. return;
  7. }
  8. if(left>=1) {
  9. generateHelper(left-1,right,cur.append('('));
  10. cur.deleteCharAt(cur.length()-1);
  11. }
  12. if(right>=1) {
  13. generateHelper(left,right-1,cur.append(')'));
  14. cur.deleteCharAt(cur.length()-1);
  15. }
  16. }
  17. public List<String> generateParenthesis(int n) {
  18. if(n==0) return res;
  19. StringBuffer cur = new StringBuffer();
  20. generateHelper(n,n,cur);
  21. return res;
  22. }
posted @ 2014-07-24 00:23  purejade  阅读(116)  评论(0)    收藏  举报