目录
每日一句
人和人是不平等的,其中最重要的原因,是人与人有知识的差异。
作者简介
👨🎓一位20级的计科专业的新手,请各位大佬多多指教
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/12
『LeetCode|每日一题』括号生成
1.每日一题
2.解题思路(递归)
2.1 思路分析
可以定义两个变量l和r代表左括号和右括号的数量,同时通过l和r实现剪枝,规则如图所示
S1:判断递归的结束条件,很显然,当括号中左括号和右括号数量相等且都等于n时,即找到了一个有效括号;
S2:剪枝:如上图
- 当左括号的数量小于右括号的数量,那么括号一定无效
- 当左括号的数量大于n时,则不符合题目要求
S3:递归:如果每次填的是"(",则left + 1,right不变,相反如果每次填的是")",则right + 1,left不变;
S4:最后把拼接的字符串添加进ans即可
2.1 核心代码(递归)
//递归
public void digui(int l , int r , String res){
if(l == n && r == n) { //递归结束条件
ans.add(res);
return ;
}
//剪枝
//无效的括号
// 全部都是左括号,不能再加左括号 l肯定会比r先超过n
if(l < r || l > n) return ;
digui(l + 1 , r , res + "(");
digui(l , r + 1 , res + ")");
}
2.2 全部代码
class Solution {
List<String> ans = new ArrayList<String>();
int n;
public List<String> generateParenthesis(int n) {
this.n = n;
digui(0 , 0 , "");
return ans;
}
//递归
public void digui(int l , int r , String res){
if(l == n && r == n) { //递归结束条件
ans.add(res);
return ;
}
//剪枝
//无效的括号
// 全部都是左括号,不能再加左括号 l肯定会比r先超过n
if(l < r || l > n) return ;
digui(l + 1 , r , res + "(");
digui(l , r + 1 , res + ")");
}
}
2.3 运行结果
3.解题思路(回溯)
3.1 思路分析
思路和递归类似,不过回溯中有一步必须完成,那就是必须把前一次拼接在sb后面的字符删掉,这是回溯的标志;
退出回溯的条件和剪枝都与递归一样
3.1 核心代码(回溯)
//回溯
public void backtrack(int l , int r){
if(l == n && r == n) { //递归结束条件
ans.add(sb.toString());
return ;
}
//剪枝
//无效的括号
// 全部都是左括号,不能再加左括号 l肯定会比r先超过n
if(l < r || l > n) return ;
//回溯
sb.append("(");
backtrack(l + 1 , r);
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
backtrack(l , r + 1);
sb.deleteCharAt(sb.length() - 1);
}
3.2 全部代码
class Solution {
List<String> ans = new ArrayList<String>();
int n;
StringBuilder sb = new StringBuilder();
public List<String> generateParenthesis(int n) {
this.n = n;
backtrack(0 , 0);
return ans;
}
//回溯
public void backtrack(int l , int r){
if(l == n && r == n) { //递归结束条件
ans.add(sb.toString());
return ;
}
//剪枝
//无效的括号
// 全部都是左括号,不能再加左括号 l肯定会比r先超过n
if(l < r || l > n) return ;
//回溯
sb.append("(");
backtrack(l + 1 , r);
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
backtrack(l , r + 1);
sb.deleteCharAt(sb.length() - 1);
}
}
3.3 运行结果
🍁 类似题目推荐:
如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!