import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串ArrayList */ public ArrayList<String> generateParenthesis (int n) { // write code here ArrayList<String> res = new ArrayList<>(); //dfs_slow(res, n * 2, new LinkedList<>()); dfs(res, new LinkedList<>(), n, 0, 0); return res; } //记录当前左右括号数量避免生成无效序列 public void dfs(ArrayList<String> res, LinkedList<Character> cur, int n, int left, int right ) { if (left == n && right == n) { StringBuilder sb = new StringBuilder(2 * n); for (char c : cur) sb.append(c); res.add(sb.toString()); } else { if (left < n) { cur.add('('); dfs(res, cur, n, left + 1, right); cur.removeLast(); } if (right < left) { cur.add(')'); dfs(res, cur, n, left, right + 1); cur.removeLast(); } } } //枚举所有情况再筛选 public void dfs_slow(ArrayList<String> res, int n, LinkedList<Character> cur) { if (cur.size() == n) { //验证是否合法 if (isValid(cur)) { StringBuilder sb = new StringBuilder(); for (char c : cur) sb.append(c); res.add(sb.toString()); } } else { cur.add('('); dfs_slow(res, n, cur); cur.remove(cur.size() - 1); cur.add(')'); dfs_slow(res, n, cur); cur.remove(cur.size() - 1); } } private boolean isValid(LinkedList<Character> cur) { // TODO Stack<Character> stack = new Stack<>(); for (char c : cur) { if (stack.isEmpty() || c == '(') stack.add(c); else if (c == ')' && stack.peek() == '(') stack.pop(); } return stack.isEmpty(); } }