【LeetCode】22.括号生成

【LeetCode】22.括号生成

题目描述

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

题解

熟悉分治算法的都知道,此题和全排列问题如出一辙,甚至更为简单一点,因为我们只需要考虑配对的情况
另外,既然是带搜素的全排列问题,就必须对搜素的解空间进行减枝
减枝条件:当左括号数或右括号数大于n或者右括号数比左括号数大时,停止搜索(无效的解,舍弃)
可以考虑在当列表中输入一个半括号后不停地迭代,直到左右半括号的数量相等,停止迭代,将结果存入结果列表中
搜索采用BFS

代码

class Solution {
        public List<String> generateParenthesis(int n) {
            List<String>res=new ArrayList<>();
            generate(res,"",0,0,n);//初始值设为0
            return res;
        }
        public void generate(List<String>res, String ans, int cnt1,int cnt2, int n){
            if(cnt1>n||cnt2>n||cnt2>cnt1) return;
            if(cnt1==n||cnt2==n) res.add(ans);
            //数量相等,即可以配对,答案存入列表
            if(cnt1>=cnt2){//减枝
                String str1=new String(ans);
                //在前一个的基础上进行BFS搜索
                generate(res, ans+"(", cnt1+1, cnt2, n);
                generate(res, str1+")", cnt1, cnt2+1, n);
            }
        }
    }

总结

这题是在栈的经典应用——括号匹配的基础上进行拓展为搜索+减枝
关键还是在于如何进行减枝以提高搜索的效率

发布了29 篇原创文章 · 获赞 18 · 访问量 3991

猜你喜欢

转载自blog.csdn.net/weixin_44522586/article/details/104696901