Leetcode括号生成

126 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

例1:

输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]

例2:

输入: n = 1
输出: ["()"]

二、解题思路

拿到这道题,马上就有了两条思路,一是使用递归,问题是递归的时候,要保证括号组合是有效的,即右括号数量不能超越左括号。一是使用动态规划,如何在已有的结构上添加括号是个关键,很可能会出现重复的结构。我在这道题上用的是递归,递归的步骤较为简单,使用深度优先搜索,依次在原字符串上添加()即可,当两种括号都用完把字符串添加进答案数组。注意点是保证0<=left<=right,限定这个条件使得得到的都是有效括号串,且递归不会超过限定的层数。

三、AC代码

var generateParenthesis = function(n) {
    let res = [];
    let dfs = function(s,left,right){
        if(left === 0 && right === 0){
            res.push(s);
            return;
        }
        if(left<0) return;
        if (right < left) return;
        dfs(s+'(',left-1,right);
        dfs(s+')',left,right-1);
    }
    dfs('',n,n);
    return res;
};

四、总结

贴一个动态规划的解法。

public static List<String> generateParenthesis(int n) {
    List<String> list = new ArrayList<>();
    if (n == 0) {//边界条件的判断
        list.add("");
        return list;
    }
    for (int m = 0; m < n; m++) {
        int k = n - m - 1;
        List<String> first = generateParenthesis(m);
        List<String> second = generateParenthesis(k);
        for (String left : first) {
            for (String right : second) {
                list.add("(" + left + ")" + right);
            }
        }
    }
    return list;
}

作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv33m7/?discussion=rKdf5H