看题目描述
这样的话,首先返回的东西是一个列表<String>
看到有关括号匹配括号生成我们自然而然想到了,栈
Stack<Character>
n>=1 <=8所以我们不需要考虑栈为空的可能
那么思路如下,如果括号是左括号,丢进去,然后如果是又括号,那么就要考虑前面,那么可以用到stack的push和pop方法
首先它题目里面只给我们一个n然后那么我们栈空间需要2n
然后所有可能也就是我们需要去遍历C2n n
n=1 遍历 2次
n=2 遍历 6次
…高中数学基本问题
排列组合
但是在java里面并没有这个样的函数,至少我还不知道
那么我们就考虑用递归
但是这个思路好像有点麻烦,还要鉴权
新的思路是这样的
这个题目的鉴权条件没那么复杂
根本上只需要左括号数量大于等于右括号即可
那么这种
((()))
class Solution {
public List<String> generateParenthesis(int n) {
List<String> list=new ArrayList<>();
backtrack("",0,0,n);
return list;
}
private void backtrack(String current,int left,int right,int max)
{
if(current.length()==max*2)
{
list.add(current);
return;
}
else
{
if(left<max)
{
backtrack(current+'(',left+1,right,max);
//加左括号的方式会到函数里面去了,如果不加左括号就会掉出来加右括号了,但是此时主程序还将继续执行,探索右括号的可能
}
if(right<left)
{
backtrack(current+')',left,right+1,max);
}
//这两个条件导致不会大于max*2
//但是这两个条件一定会把所有可能返回吗?还得想想,答案是能返回的,回溯发这边
}
}
}
这里我出了点问题,就是把那个list去变成了局部变量所以呢
我们现在去改改
class Solution {
List<String> list=new ArrayList<>();
public List<String> generateParenthesis(int n) {
backtrack("",0,0,n);
return list;
}
private void backtrack(String current,int left,int right,int max)
{
if(current.length()==max*2)
{
list.add(current);
return;
}
else
{
if(left<max)
{
backtrack(current+'(',left+1,right,max);
//加左括号的方式会到函数里面去了,如果不加左括号就会掉出来加右括号了,但是此时主程序还将继续执行,探索右括号的可能
}
if(right<left)
{
backtrack(current+')',left,right+1,max);
}
//这两个条件导致不会大于max*2
//但是这两个条件一定会把所有可能返回吗?还得想想,答案是能返回的,回溯发这边
}
}
}