2

题目: 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:

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

分析:这道题不难,只要分析对了,一切迎刃而解。怪只怪我思维定势太严重,总认为括号是成对出现的,于是写出了这样的代码:

private void generate(String prefix, String suffix, ArrayList<String> strings, int n) {
        if (n == 1) {
            strings.add(prefix + "()" + suffix);
            return;
        }

        generate(prefix + "(", ")" + suffix, strings, n - 1);
        generate(prefix + "()", suffix, strings, n - 1);
        if (suffix.length() > 0) {
            generate(prefix + "()" + suffix, "", strings, n - 1);
        }

}

当n = 4时,上述代码是生成不出((())())这种效果的,具体的不分析了。

正确的思考方式是采用DFS。

  • 如果左括号还能括就不断的画左括号,直到左括号的数量等于n。
  • 接下来考虑右括号,因为对于一对括号,右括号不能出现在左括号前,所以当右括号数量小于左括号时,加上右括号。
  • 当左右括号数量都等于n时,得到解。

这种策略可以保证每一步都是一个全新的解,甩出上一种解法好几条街。

代码:

public class Solution {
    public ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> strings = new ArrayList<String>();
        if (n == 0) return strings;

        dfs(0, 0, "", strings, n);

        return strings;
    }

    private void dfs(int left, int right, String buffer, ArrayList<String> strings, int n) {
        if (left == n && right == n) {
            strings.add(buffer);
            return;
        }

        if (left < n) {
            dfs(left + 1, right, buffer + "(", strings, n);
        }

        if (left > right) {
            dfs(left, right + 1, buffer + ")", strings, n);
        }
    }
}

ssnau
1.5k 声望98 粉丝

负能量职业打码师


引用和评论

0 条评论