括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路:
使用交换法全排序,然后用栈去做筛选
AC代码:
class Solution {
public List<String> generateParenthesis(int n) {
char[] s=new char[n*2];
List<String>list=new ArrayList<>();
for(int i=0;i<2*n;i++){
if(i<n)s[i]='(';
else s[i]=')';
}
list.add(new String(s));
for(int i=0;i<s.length-1;i++){
int size=list.size();
for(int j=i+1;j<s.length;j++){
for(int k=0;k<size;k++){
if(judge(swap(list.get(k),i,j))){
if(!list.contains(new String(swap(list.get(k),i,j)))){
list.add(new String(swap(list.get(k),i,j)));
}
}
}
}
}
return list;
}
public boolean judge(char[] s){
Stack<Character>s1=new Stack<>();
s1.push(s[0]);
int j=1;
while(j<s.length){
if(s[j]==')'){
if(s1.isEmpty())return false;
if(s1.peek()=='('){
s1.pop();
j++;
}
else return false;
}
else{
s1.push(s[j]);
j++;
}
}
if(!s1.isEmpty()||j<s.length)return false;
return true;
}
public char[] swap(String s,int i,int j){
char[] s1=s.toCharArray();
char t=s1[i];
s1[i]=s1[j];
s1[j]=t;
return s1;
}
}