👉️ 力扣原文
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
输入:n = 1
输出:["()"]
递归和回溯的方法:
class Solution {public List generateParenthesis(int n) {List res = new ArrayList<>();gen(n , n , "", res);return res;}private void gen(int left, int right, String str, List res){if(left == 0 && right == 0){res.add(str);return;}if(left > 0){gen(left - 1,right, str+"(", res );}if(right > left){gen(left, right - 1, str+")", res);}}}
执行结果
另一种递归的思路,效率不是很高。
class Solution {public static List generateParenthesis(int n){if (n == 1){return Arrays.asList("()");}HashSet set = new HashSet<>();for (String str : generateParenthesis(n - 1)){for (int i = 0; i <= str.length()/2; i++) {set.add(str.substring(0,i) + "()" + str.substring(i,str.length()));}}return new ArrayList<>(set);}}
执行结果
动态规划
class Solution {public static List generateParenthesis(int n) {List[] dp = new List[n + 1];dp[0] = Arrays.asList("");for (int i = 1; i <= n; i++) {dp[i] = new ArrayList<>();for (int j = 0; j < i; j++) {for (String left : dp[j]) {for (String right : dp[i - j - 1]) {dp[i].add("(" + left + ")" + right);}}}}return dp[n];}}
执行结果