Backtracking with open/close counts
Time O(4ⁿ / √n) (the Catalan number of results) Space O(n)If open < n, add '('. If close < open, add ')'. Record when length is 2n. Invalid strings are never built.
import java.util.*;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> out = new ArrayList<>();
dfs(n, 0, 0, new StringBuilder(), out);
return out;
}
private void dfs(int n, int open, int close, StringBuilder sb, List<String> out) {
if (sb.length() == 2 * n) { out.add(sb.toString()); return; }
if (open < n) {
sb.append('(');
dfs(n, open + 1, close, sb, out);
sb.deleteCharAt(sb.length() - 1);
}
if (close < open) {
sb.append(')');
dfs(n, open, close + 1, sb, out);
sb.deleteCharAt(sb.length() - 1);
}
}
}Verdict: Generates only valid strings.