Leetcode22.括号生成

本文探讨了LeetCode上的括号生成问题,给出了两种解决方案:暴力求解和优化算法。暴力方法通过递归尝试所有可能的括号组合,而优化方法则利用括号数量的特性来减少无效组合的生成。在回溯过程中,注意删除不必要的字符以避免StringBuilder错误。代码实现详细解释了每个部分的功能,并提供了有效的括号组合示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:
输入:n = 1
输出:["()"]

提示:

1 <= n <= 8

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、代码实现

1、暴力

class Solution {
    public List<String> generateParenthesis(int n) {
    List<String> list=new ArrayList<String>();
    generate(new char[2*n],0,list);
    return list;
    }
    private  void generate(char[] cs, int pos, List<String> list) {
		// TODO Auto-generated method stub
		if(cs.length==pos) {
			if(isValid(new String(cs)))
				list.add(new String(cs));
		}
		else {
			cs[pos]='(';
			generate(cs,pos+1,list);
			cs[pos]=')';
			generate(cs,pos+1,list);
		}
	}

	public  boolean isValid(String s) {
		Stack<Character> stack1 = new Stack<Character>();
		Stack<Character> stack2 = new Stack<Character>();
		char[] c = s.toCharArray();
		for (int i = 0; i < c.length; i++) {
			stack1.push(c[i]);
		}
		while (!stack1.empty()) {
			char temp = stack1.pop();
			if (isRight(temp))
				stack2.push(temp);
			else if (stack2.isEmpty() || !isMatch(temp, stack2.pop())) {
				return false;
			}
		}
		if (!stack2.isEmpty())
			return false;
		return true;
	}

	private  boolean isMatch(char temp, Character temp2) {
		// TODO Auto-generated method stub
		return (temp == '{' && temp2 == '}') || (temp == '[' && temp2 == ']') || (temp == '(' && temp2 == ')');
	}

	private  boolean isRight(char temp) {
		// TODO Auto-generated method stub
		return (temp == ']' || temp == '}' || temp == ')');
	}
}

2、优化

抓住了2n个必有n个(,n个)

bug积累
1)第一次做的时候,在调用最后一行代码generate1(n,ans,pos+1,list,open+1,close);后,没有进行删除,认为都是最后一行代码,删除了也没有用。实际上,return后,如果没有删除当前位置加的char,StringBuilder就会出现错误。
2)回溯一定要设置终止条件,在测试的时候栈溢出,其实是if(cur.length()==2*max) {ans.add(cur.toString()); }需要改成if(cur.length()==2*max) { ans.add(cur.toString()); return; }.

class Solution {
    public List<String> generateParenthesis(int n) {
    List<String> ans=new ArrayList<String>();
	generate(n,new StringBuilder(),ans,0,0);
	return ans;
    }
    private static void generate(int max, StringBuilder cur, List<String> ans, int open, int close) {
	// TODO Auto-generated method stub
	if(cur.length()==2*max) {
		ans.add(cur.toString());
	    return;	
	}
	if(open<max) {
		cur.append('(');
		generate(max,cur,ans,open+1,close);
		cur.deleteCharAt(cur.length()-1);
	}
	if(close<open) {
		cur.append(')');
		generate(max,cur,ans,open,close+1);
		cur.deleteCharAt(cur.length()-1);
	}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值