Track two counts: open parentheses used and close parentheses used.
You can add ( if open < n.
You can add ) if close < open (ensures validity).
When open == close == n, add the string to results.
This naturally generates only valid combinations.