(回溯)Leetcode22. 括号生成 java

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n=3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

  我理解的回溯是在进行下一个操作的时候回到当前的状态,这道题的代码一眼看去看不到回溯的步骤。但是仔细一想就能知道,生成左括号的时候传参传的是 str+'(' ,并没有改变str的值。当再去操作右括号的时候相当于还是用str本身的值进行操作。

 有一步需要理解的,我已经写到了注释里。

成功

显示详情

执行用时 : 3 ms, 在Generate Parentheses的Java提交中击败了84.90% 的用户

内存消耗 : 38.3 MB, 在Generate Parentheses的Java提交中击败了56.63% 的用户

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<String>();
        if(n == 0)
            return res;
        String str = new String();
        helper(res, str, n, n);
        return res;
    }
    private void helper(List<String> list, String str, int l, int r){
        if(l==0 && r==0){
            list.add(str);
            return ;
        }
        if(l>0)
            helper(list, str+'(', l-1, r);
        //对于一个有效的结果来说 一定是先出现了左括号 再出现右括号。
        //即左括号的数量总是小于右括号的数量,l<r
        if(r>l)
            helper(list, str+')', l, r-1);
    }
}

 


版权声明:本文为HaleyDong原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。