22. 括号生成

回溯法
  1. class Solution {
  2. public List<String> generateParenthesis(int n) {
  3. List<String> ans = new ArrayList<>();
  4. if (n <= 0)
  5. return ans;
  6. generate(new StringBuilder(), 0, 0, n, ans);
  7. return ans;
  8. }
  9. private void generate(StringBuilder currString, int left, int right, int max, List<String> ans) {
  10. if (currString.length() == max * 2) {
  11. ans.add(currString.toString());
  12. return ;
  13. }
  14. if (left < max) { // 能够继续添加左括号
  15. currString.append('(');
  16. generate(currString, left + 1, right, max, ans);
  17. currString.deleteCharAt(currString.length() - 1);
  18. }
  19. if (right < left) { // 能够添加有括号
  20. currString.append(')');
  21. generate(currString, left, right + 1, max, ans);
  22. currString.deleteCharAt(currString.length() - 1);
  23. }
  24. }
  25. }

蛮力法
class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        if (n <= 0)
            return ans;

        generate(new char[2 * n], 0, ans);

        return ans;
    }

    private void generate(char[] currentString, int pos, List<String> ans) {
        if (pos == currentString.length) {
            if (valid(currentString))
                ans.add(new String(currentString));
        } else {
            currentString[pos] = '(';
            generate(currentString, pos + 1, ans);
            currentString[pos] = ')';
            generate(currentString, pos + 1, ans);
        }
    }

    private boolean valid(char[] currentString) {
        int balance = 0;
        for (char ch : currentString) {
            if (ch == '(') 
                ++balance;
            else 
                --balance;

            if (balance < 0)
                return false;
        } 

        if (balance == 0)
            return true;

        return false;
    }
}