力扣第22题 中等难度 括号生成

先看一眼题:
在这里插入图片描述

我的思路:
输入: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%用户,莫非我这是最优解吗,哈哈!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值