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

被折叠的 条评论
为什么被折叠?



