LeetCode22.Generate Parentheses 产生括号组合

22.产生括号组合

22. 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:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
暴力枚举

暴力破解的思路也很简单。而关键一点是如何判断枚举出来的结果是正确的。这里使用了平衡值来判断。通过扫描当前的字符串,左括号使值加一,右括号使值减一。当平衡值为0的话,那么就代表着左括号和右括号相等,即满足题目的条件。否认则丢弃该结果。

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> combinations = new ArrayList();
        generateAll(new char[2 * n], 0, combinations);
        return combinations;
    }

    public void generateAll(char[] current, int pos, List<String> result) {
        if (pos == current.length) {
            if (valid(current))
                result.add(new String(current));
        } else {
            current[pos] = '(';
            generateAll(current, pos+1, result);
            current[pos] = ')';
            generateAll(current, pos+1, result);
        }
    }

    public boolean valid(char[] current) {
        int balance = 0;
        for (char c: current) {
            if (c == '(') balance++;
            else balance--;
            if (balance < 0) return false;
        }
        return (balance == 0);
    }
}

回溯法

这种组合问题是一个枚举问题。需要枚举出所有的情况,也正因为如此,使用回溯法是一种很不错的方式。回溯法的关键就是判断当前状态是否满足所给条件或者是否为最优状态。如果不满足就回到上一步。而本题当中,隐藏的条件就是左括号数量必须与右括号的数量相等。即如果所给结果总长度为n的话,左右括号的个数必然是n/2。

代码14行表示,左括号的个数并没有达到目的个数。而18行表示,右括号的个数并没有与左括号的个数相等。而第9行表示,已经达到了目的个数,可以返回了。

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> result = new ArrayList();
        backtrack(result,"",0,0,n);
        return result;
    }
    
    public void backtrack(List<String> result,String cur, int open, int close, int max){
        if(cur.length() == max * 2){
            result.add(cur);
            return;
        }
        
        if(open < max){
            backtrack(result,cur+'(',open+1,close,max);
        } 
        
        if(close < open){
            backtrack(result,cur+')',open,close+1,max);
        }
    }
}

你可能感兴趣的:(算法笔记)