【Hot100】LeetCode—22. 括号生成
目录
- 1- 思路
- 回溯
- 2- 实现
- ⭐22. 括号生成——题解思路
- 3- ACM 实现
- 原题链接:22. 括号生成
1- 思路
回溯
- 本题无需判断括号是否是有效的,只需要在回溯的过程中用
int l
和int r
两个整型变量记录左右括号数即可。
思路
- 回溯过程,
i
从0
开始 到i < 2
,即每次添加一对括号 i = 1
添加左括号i = 2
添加右括号
2- 实现
⭐22. 括号生成——题解思路
class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
backTracing(n,0,0);
return res;
}
StringBuilder sb = new StringBuilder();
public void backTracing(int n,int l,int r){
// 终止条件
if(l>n || l<r){
return ;
}
if(sb.length() == n*2){
res.add(sb.toString());
}
// 添加括号
for(int i = 0 ; i < 2 ;i++){
if(i==0){
sb.append("(");
backTracing(n,l+1,r);
sb.deleteCharAt(sb.length()-1);
}
if(i==1){
sb.append(")");
backTracing(n,l,r+1);
sb.deleteCharAt(sb.length()-1);
}
}
}
}
3- ACM 实现
public class generationP {
static List<String> res = new ArrayList<>();
public static List<String> generateParenthesis(int n) {
backTracing(n,0,0);
return res;
}
static StringBuilder sb = new StringBuilder();
public static void backTracing(int n,int l,int r){
// 终止条件
if(l>n || l<r){
return ;
}
if(sb.length() == n*2){
res.add(sb.toString());
}
// 添加括号
for(int i = 0 ; i < 2 ;i++){
if(i==0){
sb.append("(");
backTracing(n,l+1,r);
sb.deleteCharAt(sb.length()-1);
}
if(i==1){
sb.append(")");
backTracing(n,l,r+1);
sb.deleteCharAt(sb.length()-1);
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println("结果是"+generateParenthesis(n).toString());
}
}