美文网首页
leetcode 22GenerateParentheses

leetcode 22GenerateParentheses

作者: 萍水间人 | 来源:发表于2019-06-27 20:40 被阅读0次

注意题目的要求是一定要well-formed的

借着这个题目好好地捋了一下回溯法的巧妙

画了一副很潦草的图

当然自己没做出来,好好地研究了一下答案,之后自己用JavaScript写了一下

public class GenerateParentheses {
    static public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList();
        backtrack(ans, "", 0, 0, n);
        return ans;
    }

    static public void backtrack(List<String> ans, String cur, int open, int close, int max){
        if (cur.length() == max * 2) {
            ans.add(cur);
            return;
        }

        if (open < max)
            backtrack(ans, cur+"(", open+1, close, max);
        if (close < open)
            backtrack(ans, cur+")", open, close+1, max);
    }

    public static void main(String[] args) {
        System.out.println(generateParenthesis(3));
    }
}

大致说一下,第一个只选左括号,然后不断地选下去,直到左括号选完,有一个open变量记录左括号的已经使用的个数,达到上限之后开始加右括号,这样代码中close<open时连续三次调用的函数在退栈的时候就一次性解决了,然后这时候回退到只选了两个左括号的情况,就这样。

但是用JavaScript实现的时候,出问题了


function solution(n, left, right, ans, ansArray) {



    //n组括号,n个左括号,n个右括号
    //最左边肯定是左括号
    // let max = n; //

    // let ans = null;

    // let cur = null; //记录当前的位置
    if (ans.length == n * 2) {
        ansArray.push(ans);
        return;
    }
    // let left = null;
    // let right = null;
    if (left < n) {
        // ans += '(';
        // left+=1;
        // cur+=1;
        //继续调用函数,改变当前指针的位置
        solution(n, left + 1, right, ans + '(', ansArray);

    }
    //如果left>=n
    if (right < n) {
        // ans += ')';
        // right+=1;
        // cur+=1;

        //这里之前一直遇到了一个问题,就是输出的答案有重复,但是后来发现,其实如果将其写入函数的参数中就不会出现这个问题
        //TODO 这里的代码输出还是有问题,为什么模仿java写的代码结果相差这么多?
        solution(n, left, right + 1, ans + ')', ansArray);
    }

}

//soluion(n, int cur, int left, int right)
ansArray = new Array();
ans = "";
solution(3, 0, 0, ans, ansArray);
console.log(ansArray);

初次接触JavaScript,还不是很熟悉
可以看到代码中注释的地方

这里面调试的艰辛就不说了,
不过最后的代码还是有问题
输出的结果:

[ '((()))',
  '(()())',
  '(())()',
  '(()))(',
  '()(())',
  '()()()',
  '()())(',
  '())(()',
  '())()(',
  '()))((',
  ')((())',
  ')(()()',
  ')(())(',
  ')()(()',
  ')()()(',
  ')())((',
  '))((()',
  '))(()(',
  '))()((',
  ')))(((' ]

暂时记录一下

相关文章

网友评论

      本文标题:leetcode 22GenerateParentheses

      本文链接:https://www.haomeiwen.com/subject/nnsdcctx.html