数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 | |
输出:["((()))","(()())","(())()","()(())","()()()"] |
示例 2:
输入:n = 1 | |
输出:["()"] |
提示:
- 1 <= n <= 8
题解
import java.util.ArrayList; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
/** | |
* 思路: | |
* 1:() | |
* 2:从左到右插入 (),得:(()) ()() | |
* 3: 再次插入,去掉重复:(()()) ((())) (()()) | ()()() | |
*/ | |
class Solution { | |
public List<String> generateParenthesis(int n) { | |
// 初始化一个括号 | |
List<String> result = new ArrayList<>(); | |
result.add("()"); | |
// 从第二个括号开始 | |
for (int i = 2;i <= n; i++){ | |
// 记录二个括号的所有结果 | |
Set<String> current = new HashSet<>(); | |
// 循环第一个括号的所有结果 | |
for (String res : result){ | |
// 对每一个结果,从左到右插入 () | |
for (int j = 0; j < res.length(); j++){ | |
current.add(res.substring(0, j) + "()" + res.substring(j)); | |
} | |
} | |
result = new ArrayList<>(current); | |
} | |
return result; | |
} | |
} |
递归
class Solution { | |
public List<String> generateParenthesis(int n) { | |
if (n == 1) return Arrays.asList("()"); | |
Set<String> result = new HashSet<>(); | |
for (String res : generateParenthesis(n - 1)){ | |
for (int i = 0; i < res.length(); i++){ | |
result.add(res.substring(0, i) + "()" + res.substring(i)); | |
} | |
} | |
return new ArrayList<>(result); | |
} | |
} |
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/generate-parentheses