事实证明一次发多篇文章,后面的被疏漏的可能性很大,一直没有比较好的法子来规范这种算法文章,所以后面还是逐题发布吧,毕竟不是所有小伙伴都喜欢刷刷刷的~
一 目录
不折腾的前端,和咸鱼有什么区别
目录 |
---|
一 目录 |
二 题目 |
三 解题思路 |
四 统计分析 |
五 解题套路 |
二 题目
括号。
设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bracket-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
};
根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。
三 解题思路
这题可以用递归破解:
18:15 解法 1:递归
const generateParenthesis = (n) => {
const result = [];
// 递归取值
const dfs = (cur, left, right) => {
// 如果当前字符串的长度是 n * 2(即 n 对),收租
if (cur.length === 2 * n) {
result.push(cur);
return;
}
// 左边起手
if (left < n) {
dfs(cur + '(', left + 1, right);
}
// 右边补足
if (right < left) {
dfs(cur + ')', left, right + 1);
}
};
dfs('', 0, 0);
return result;
};
是怎么个思路呢?假设我们传入的数字是 2:
( ——> (( ——> (() ——> (())
( ——> () ——> ()( —— > ()()
我们设置 3 个参数:
cur
:当前字符串left
:左括号个数right
:右括号个数
万事我们从左开头:
if (left < n) {
dfs(cur + '(', left + 1, right);
}
如果我们左边尚未补足,那么我们就新增左边参数。
然后,我们进一步补足右边参数:
// 右边补足
if (right < left) {
dfs(cur + ')', left, right + 1);
}
那么,我们就会得到:
------
'' 0 0
------
( 1 0
------
(( 2 0
------
(() 2 1
------
(()) 2 2
这时候小伙伴脑子可能有点卡壳,第一种方法出来了,第二种是怎么出来的呢?
首先,第一种结局
(()) 2 2
是从(( 2 0
走出来的,意味着现在它完结了,我们就回退一层。然后,到了
( 1 0
后,我们会走右边判断0 < 1
(right < left),所以我们会先走右边得到() 1 1
,然后进一步走出:
------
() 1 1
------
()( 2 1
------
()() 2 2
最后,这步走完了,我们再一次回退,发现是从 () 1 1
走出来的,那么再上一层就是 '' 0 0
,无路可走,直接退出递归。
所以最后输出:
[ '(())', '()()' ]
以此类推,得到整个深度优先搜索的结果。
四 统计分析
本题不需要统计分析。
五 套路分析
本题暂未发现任何套路,如果有但是 jsliang 后面发现了的话,会在 GitHub 进行补充。
如果小伙伴有更好的思路想法,或者没看懂其中某种解法,欢迎评论留言或者私聊 jsliang~
不折腾的前端,和咸鱼有什么区别!
jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。
浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!
扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。