括号生成
问题描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
例子:
解题思路
使用回溯法穷举,使用One_of_ans[2*n]数组来存储结果,若One_of_ans[i]为0则为右括号,若One_of_ans[i]为1则为左括号,遍历子集树得到可行解,再根据One_of_ans[]转化为字符串得到本题答案。
代码
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
int One_of_ans[] = new int[2*n];
backtrack(res,One_of_ans,2*n,0);
return res;
}
public void backtrack(List<String> res,int One_of_ans[],int n,int t){//回溯
// System.out.print("现在在第"+t+"层:");
if(t>=n)
output(res,One_of_ans,n);
else{
for(int i=0;i<=1;i++){
One_of_ans[t] = i;
backtrack(res,One_of_ans,n,t+1);
}
}
}
public void output(List<String> res,int One_of_ans[],int n){ //根据整型数组得到结果
if(legal(One_of_ans,n)){
String OneOfAns = "";
for(int i : One_of_ans){
if(i == 0)
OneOfAns = OneOfAns +"(";
else
OneOfAns = OneOfAns+ ")";
}
res.add(OneOfAns);
}
}
public boolean legal(int One_of_ans[],int n){//判断是否为合法括号
for(int i : One_of_ans)
System.out.print(i);
System.out.println();
Stack<Integer> s = new Stack<>();
for(int i : One_of_ans){
if(i == 0)
s.push(new Integer(1));
else if(s.isEmpty() || !s.pop().equals((Integer)i))
return false;
}
if(!s.isEmpty())
return false;
return true;
}
}
小总结
由此题get到的Java语法的注意点:
- Java的Stack类的参数是对象类型;
- 对象类型的比较用equals()方法,而不是 == 。