[leetcode]Generate Parentheses

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:

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

算法思路:

DFS,对每一位,尝试后缀‘(’ 或 ‘)’,用k记录左括号的个数,用couple记录成功匹配对数,注意剪枝

这个代码是我看到的几乎最简练的算法:[leetcode]Generate Parentheses

代码如下:

 1  public class Solution {
 2      List<String> result = new ArrayList<String>();
 3      public List<String> generateParenthesis(int n) {
 4          dfs(new StringBuilder(),0,0,n);
 5          return result;
 6      }
 7      private void dfs(StringBuilder sb,int k,int couple,int n){
 8          if(k == 0 && couple == n && sb.length() == 2 * n ){
 9              result.add(sb.toString());
10              return;
11          }
12          if( k < 0 || sb.length() > 2 * n) return;//剪枝
13          char[] c = {'(',')'};
14          for(int i = 0; i < 2; i++){
15             k = (i == 0 )? k + 1 : k-1;
16             if(k > 0 && i == 1) {//配对的前提是k>0,即存在未配对的左括号
17                  couple++;
18                  k--;
19              }
20          if(k < 0){//如果前面木有左括号,则只能匹配右括号
21                  k++;
22                  continue;
23              }
24              dfs(sb.append(c[i]), k,couple, n);
25              sb.deleteCharAt(sb.length() - 1);
26          }
27      }
28  }

 

第二遍记录:

同样的DFS,这次的代码可读性可能稍微好一点:

 1 public class Solution {
 2     List<String> res = new ArrayList<String>();
 3     public List<String> generateParenthesis(int n) {
 4         if(n <= 0) return res;
 5         dfs(new StringBuilder(), 0, 0, n);
 6         return res;
 7     }
 8     private void dfs(StringBuilder sb,int l,int k,int n){//k表示左括号个数,l表示当前sb的长度,可省去
 9         if(k == n && l == 2 * n){
10             res.add(sb.toString());
11             return;
12         }
13         if( k > n || 2 * k < l) return;//左括号数> n 或者 右括号比左括号多时,不合法
14         char[] ca = {'(',')'};
15         for(int i = 0; i < 2;i++){
16             sb.append(ca[i]);
17             if(i == 0)
18                 dfs(sb, l + 1, k + 1, n);
19             else
20                 dfs(sb, l + 1, k, n);
21             sb.deleteCharAt(sb.length() - 1);
22         }
23     }
24 }

 

迷迷糊糊的。。。

 

posted on 2014-07-15 20:33  喵星人与汪星人  阅读(243)  评论(0编辑  收藏  举报