22. 括号生成
有效的含义是指的右括号的数量不能超过左括号。
参考官方答案以及评论
1.完全暴力方法
列举出所有的情况,把无效的舍去
class Solution {
public List<String> generateParenthesis(int n) {
List<String> combinations = new ArrayList<String>();
generateAll(new char[2 * n], 0, combinations);
return combinations;
}
public void generateAll(char[] current, int pos, List<String> result) {
if (pos == current.length) {
if (valid(current)) {
result.add(new String(current));
}
} else {
current[pos] = '(';
generateAll(current, pos + 1, result);
current[pos] = ')';
generateAll(current, pos + 1, result);
}
}
public boolean valid(char[] current) {
int balance = 0;
for (char c: current) {
if (c == '(') {
++balance;
} else {
--balance;
}
if (balance < 0) {
return false;
}
}
return balance == 0;
}
}
2.递归的方法
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
dfs(n,"",res,0,0);
return res;
}
//open 代表 ( 的个数 初始值为 0
//close 代表 ) 的个数 初始值为 0
//s 初始值为 "" 空串
void dfs(int n, String s,List<String> res,int open,int close){
//截枝条件 close>open 说明 ) 比(多了 不符合
//并且 ( 个数不能大于n 因为总数2n ()他两加起来是2n
if(open>n||close>open){
return;
}
if(s.length()==2*n){
res.add(s);
return;
}
// ( open+1
dfs(n,s+"(",res,open+1,close);
// ) close+1
dfs(n,s+")",res,open,close+1);
}
}
3 递归实现,通过减少
和二相似,这个是减少的
class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
if(n <= 0){
return res;
}
getParenthesis("",n,n);
return res;
}
// left,right 代表左右括号的数量,用一个少一个
private void getParenthesis(String str,int left, int right) {
if(left == 0 && right == 0 ){
res.add(str);
return;
}
if(left == right){
//剩余左右括号数相等,下一个只能用左括号
getParenthesis(str+"(",left-1,right);
}else if(left < right){
//剩余左括号小于右括号,下一个可以用左括号也可以用右括号
if(left > 0){
getParenthesis(str+"(",left-1,right);
}
getParenthesis(str+")",left,right-1);
}
}
}
等同于如下
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
dfs("",res,n,n);
return res;
}
public void dfs(String s,List<String> res,int open,int close){
if(open<0||close<open){
return;
}
if(open==0&&close==0){
res.add(s);
return;
}
dfs(s+"(",res,open-1,close);
dfs(s+")",res,open,close-1);
}
}
参考:https://leetcode.cn/problems/generate-parentheses/solutions/192912/gua-hao-sheng-cheng-by-leetcode-solution/
https://leetcode.cn/u/yu-niang-niang/
作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)