回溯算法介绍

2023-05-03 来源:飞速影视
具有限界条件的 DFS (Depth first search,深度优先搜索)算法称为回溯算法。

例子


LeetCode 的第 22 题Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is:
["((()))","(()())","(())()","()(())","()()()"]
题目目的是给你一个数 n 写出来所有中可能的括号集合。
本题采用的回溯的解题思想:所谓(回溯)Backtracking 都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集。
对于这道题,有以下的限制条件:1、如果左括号已经用完了,则不能再加左括号2、如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。结束条件是:左右括号都已经用完。因此,把上面的思路写一下伪代码:
if (左右括号都已用完) { 加入解集,返回}// 否则开始情况if (还有左括号可以用) { 加一个左括号,继续递归}if (右括号小于左括号) { 加一个右括号,继续递归}
具体实现:
/** * @param {number} n * @return {string[]} */ var generateParenthesis = function (n) { var ans = []; dfs(ans, "", 0, 0, n); return ans;};function dfs(ans, str, left, right, n) { if (left === n && right === n) ans.push(str); if (left < n) { dfs(ans, str "(", left 1, right, n); } if (right < left) { dfs(ans, str ")", left, right 1, n); }}console.log(generateParenthesis(3));// ["((()))", "(()())", "(())()", "()(())", "()()()"]
相关影视
合作伙伴
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)

www.fs94.org-飞速影视 粤ICP备74369512号