题目链接:LeeCode22括号生成
题目描述:
拿到题目一脸懵b,想了半天想到了一个类似dp的方法,三个括号的解是由一个括号的解和两个括号的解拼出来的,五个括号的解是一个括号和四个括号的解拼接还有两个括号和三个括号解拼接,只有一种特殊情况那就是3个括号的解除了一个和两个拼接的结果外还有两个括号的外层加一个括号,以此类推,先将一个括号两个括号存好,用数组存下所有可能情况的解
class Solution {
public static List<String> generateParenthesis(int n) {
ArrayList<String>[] lists=new ArrayList[10005];
ArrayList<String> list = lists[0];
ArrayList<String> listt = lists[1];
list=new ArrayList<>();
listt=new ArrayList<>();
listt.add("()()");
listt.add("(())");
lists[1]=listt;
list.add("()");
lists[0]=list;
for (int i = 2; i < n; i++) {
//存每一个个数的结果集
ArrayList<String> ans=new ArrayList();
for (int j = 0; j < (i/2)+1; j++) {
//当前结果需要的子结果集
ArrayList<String> l1 = lists[j];
ArrayList<String> l2 = lists[i-j-1];
//遍历两个字结果集
for (int k = 0; k < l1.size(); k++) {
for (int l = 0; l < l2.size(); l++) {
String s = l1.get(k);
String s1 = l2.get(l);
//将子结果拼接
String s2 =s+s1;
String s3 =s1+s;
String s4 ="";
//当j==0时就是另外一个子结果集是比当前小1的子结果集
if(j==0){
s4="("+s1+")";
}
if(!ans.contains(s2)){
ans.add(s2);
}
if(s4!=""&&!ans.contains(s4)){
ans.add(s4);
}
if(!ans.contains(s3)){
ans.add(s3);
}
}
}
}
lists[i]=ans;
}
return lists[n-1];
}
}