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