码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】GenerateParentheses

时间:2015-03-30 15:49:46      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:

  • 思路1

    这个题目也要从简单的例子入手,然后发现规律。

    1 ()

    2 ()(),(())

    3 ()()(), (())(), (()()), ()(()), ((()))

    规律是这样的 ,假设我们已经产生了n-1对括号的所有组合,那么在这个基础上我们可以产生所有的n对括号的组合,我们把一个(放在每个n-1对括号组合的开头,然后在每个每一个括号配好对的位置插入一个)。这样我们就产生了一个n对括号的组合。

  • 思路2:

    主要用到了递归的思想,递归时保证字符串中左括号数大于等于右括号数即可。

    1. 如果左括号数还没有用完,那么我们能继续放置左括号

    2. 如果已经放置的左括号数大于已经放置的右括号数,那么我们可以放置右括号 (如果放置的右括号数大于放置的左括号数,会出现不合法组合)

    所以,运用dfs在每一层递归中,如果满足条件先放置左括号,如果满足条件再放置右括号

    package leetcode.doit;

    ? ?

    import java.util.ArrayList;

    import java.util.Iterator;

    import java.util.LinkedList;

    import java.util.List;

    ? ?

    public class GenerateParentheses_my {

    public static void main(String[] args) {

    ArrayList ret = (ArrayList) generateParenthesis(3);

    ? ?

    //???????????????? Iterator<String> it = ret.iterator();

    //???????????????? while (it.hasNext()) {

    //???????????????? System.out.println(it.next());

    //???????????????? }

    ? ?

    }

    ? ?

    static List<String> generateParenthesis(int n) {

    List<String> result = new ArrayList<String>();

    if (n <= 0)

    return result;

    String s = new String();

    dfs(0, 0, n, s, result);

    return result;

    }

    ? ?

    public static void dfs(int left, int right, int n, String s,

    List<String> result) {

    System.out.println(s);

    if (left == n && left == right) {

    result.add(s);

    return;

    }

    if (left < n)

    dfs(left + 1, right, n, s + "(", result);

    if (right < left) {

    dfs(left, right + 1, n, s + ")", result);

    }

    }

    }

    ? ?

【leetcode】GenerateParentheses

标签:

原文地址:http://www.cnblogs.com/keedor/p/4378034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!