[leetcode]22. Generate Parentheses

Solution 1: 递归回溯法

回溯就是找到所有的解,一直没用java写过回溯,突然有点懵逼

一直往左下走

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

cur还是左下之前的值,再继续往右下走

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

这个类似与0-1背包问题,时间复杂度是0(2的h(n)次方),其中h(n)是一条路径的长度,在这一题就是2n。所以时间复杂度是2的2n次方也就是O(4的n次方)

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

    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);
    }
}

Solution 2: 巧妙的递归

其中left和right都是有效的string

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList();
        if (n == 0) {
            ans.add("");
        } else {
            for (int c = 0; c < n; ++c)
                for (String left: generateParenthesis(c))
                    for (String right: generateParenthesis(n-1-c))
                        ans.add("(" + left + ")" + right);
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36869329/article/details/84451087