先看一眼题:
我的思路:
输入:n = 3
输出:[
“((()))”, 111000 初始
“(()())”, 110100 2和3交换位置(循环开始3==n)
“(())()”, 110010 2和4交换位置(循环截止4 == 2*3-2)
“()(())”, 101100 1和3交换位置
“()()()” 101010 1和4交换位置
]
public class Solution22 {
public static List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
if (n == 1) {
list.add("()");
return list;
}
String init = "";
for (int i = 0; i < n; i++)
init += "(";
for (int i = 0; i < n; i++)
init += ")";
//初始化init结束
list.add(init);
for (int i = n - 1; i >= 1; i--) {
for (int j = n; j <= 2 * n - 2; j++) {
String str = new String(init);
char[] chars = str.toCharArray();
//char[i]和char[j]交换位置
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
str = new String(chars);
list.add(str);
}
}
return list;
}
public static void main(String[] args) {
List<String> list = generateParenthesis(4);
for (String str :
list) {
System.out.println(str);
}
}
}
提交——错误!
因为当n=4的时候开始,这套方法不再适用。具体例子如下:
输入:n = 4
输出:[
外层循环开始4-1=3,循环截止1
循环开始n=4 循环截止2*4-2=6
“(((())))”, 11110000 初始
“((()()))”, 11101000 3和4交换位置
“((())())”, 11100100 3和5交换位置
“((()))()”, 11100010 3和6交换位置
“(()(()))”, 11011000 2和4交换位置
“(()()())”, 11010100 2和5交换位置
“(()())()”, 11010010 2和6交换位置
“(())(())”, 11001100
“(())()()”, 11001010
“()((()))”, 10111000 1和4交换位置
“()(()())”, 10110100 1和5交换位置
“()(())()”, 10110010 1和6交换位置
“()()(())”, 10101100
“()()()()” 10101010
]
可以看出,当n=4的时候,用这种方法,会有漏网之鱼。原因在于出现了多个1和0的互换位置。
想不出来了,瞄了眼答案,说是用递归,于是想出下法:
f(8,4)=[’(’+f(7,3)]+[’)’+f(7,4)] f的第二个参数为还需要的左括号个数
显然,’)’+f(7,4) 这种情况是不合理的,因此增加约束条件,对于f(p,q),需有p-q >= q,p初始为2*n
即.还需要的右括号的个数需要大于等于还需要的左括号的个数
f(7,3)=[’(’+f(6,2)]+[’)’+f(6,3)]
f(6,2)=[’(’+f(5,1)]+[’)’+f(5,2)]
f(6,3)=[’(’+f(5,2)]+[’)’+f(5,3)]
…
f(p,q)=[’(’+f(p-1,q-1)]+[’)’+f(p-1,q)]
于是有代码:
class Solution22 {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
f(list,"",2*n,n,n);
return list;
}
public static void f(List<String> list,String s, int p, int q,int n) {
if(p-q < q)
return ;
if(q==0){
for(int i = p ;i > 0 ; i--)
s+=")";
list.add(s);
return;
}
String str1 = s+"(";
f(list,str1,p-1,q-1,n);
String str2 = s+")";
f(list,str2,p-1,q,n);
}
}
提交!打败96%用户,莫非我这是最优解吗,哈哈!