力扣P22 括号生成的DFS思路

  • 题干[括号生成](https://leetcode-cn.com/problems/generate-parentheses/)
  • 思路

题干括号生成

思路

这道题用dfs有两种思路,一种是针对总长度,每个位置都进行尝试,由于对左括号有要求,设置变量记录已有字符串中左括号匹配的数量,根据其数量分类回溯。

class Solution {public:vector<string> generateParenthesis(int n) {string path;vector<string> res;dfs(n,0,path,res);return res;}void dfs(int n,int leftok,string path,vector<string> &res){if(path.length()==n*2)  { if(leftok==n&&leftok!=0){res.push_back(path);return ;}return ;//长度已到最长,不合理情况均排除}if(path.length()-2*leftok>0){path+=')';已生成的字符串里还有未匹配的左括号,此时既可以填充左括号也可以填充右括号。dfs(n,leftok+1,path,res);path=path.substr(0,path.size()-1);}path+='(';//已生成字符串里右括号多,只能填左括号dfs(n,leftok,path,res);path=path.substr(0,path.size()-1);}
};

仔细分析便会发现,当已生成的字符串里右括号数量较多时,理应直接return,这也是这段程序速度慢的原因。
第二中思路是记录好已生成字符串里的left和right的个数,作用等同于记录路径path,相当于对之前的程序进行了简化。此时我们只需要考虑left,right和n之间的关系即可。

class Solution {public:vector<string> generateParenthesis(int n) {string path;vector<string> res;// dfs(n,0,path,res);dfs(n,0,0,path,res);return res;}void dfs(int n,int left,int right,string path,vector<string> &res){if(left==n&&right==n)  {res.push_back(path);return ;}//这里要注意对lefrright的判断要有序,先判断相等再判断不等的情况,否则可能出现重复if(left==right)  dfs(n,left+1,right,path+'(',res);if(left>right) //左括号数量较多时,既可以加左括号也可以加右括号{if(left<n)  dfs(n,left+1,right,path+'(',res);dfs(n,left,right+1,path+')',res);}if(left<right)  return;   }
};

事实上,以上程序仍有值得优化的空间,首先就是left和right均要小于n,其次就是右括号数量大于左括号时直接删除分支即可。
更简练的代码如下。

class Solution {public:vector<string> generateParenthesis(int n) {vector<string>  res;dfs(res,"",0,0,n);return res;}void dfs(vector<string> &res,string str,int l,int r,int n){if(l>n||r>n||r>l) return ;if(l==n&&r==n) {res.push_back(str); return ;}dfs(res,str+'(',l+1,r,n);dfs(res,str+')',l,r+1,n);return ;}};

力扣P22 括号生成的DFS思路相关推荐

  1. leetcode力扣23.括号生成

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [   "((()))",   "(() ...

  2. 力扣200岛屿数量(DFS/BFS)

    200. 岛屿数量 - 力扣(LeetCode) (leetcode-cn.com) 1.DFS DFS的思路是,首先遍历整个表,找到1结果就加一,之后通过DFS将找到的1连通区域内的所有1变为0,代 ...

  3. 【数据结构与算法】之深入解析“括号生成”的求解思路与算法示例

    一.题目要求 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例 1: 输入:n = 3 输出:["((()))","(() ...

  4. 力扣:组合总和 II DFS剪枝

    组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合 ...

  5. LeetCode 力扣 529. 扫雷游戏 minesweeper DFS

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 529. 扫雷游戏 题目描述 ...

  6. #力扣 LeetCode1646. 获取生成数组中的最大值 @FDDLC

    题目描述: https://leetcode-cn.com/problems/get-maximum-in-generated-array/ Java代码: class Solution {publi ...

  7. 力扣OJ(1401-1500)

    目录 1414. 和为 K 的最少斐波那契数字数目 1419. 数青蛙 1420. 生成数组 1424. 对角线遍历 II 1426. 数元素 1427. 字符串的左右移 1428. 至少有一个 1 ...

  8. [力扣刷题总结](栈和单调栈篇)

    文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...

  9. 20210503:力扣第239周周赛题解

    力扣第239周周赛 题目 思路与算法 代码实现 写在最后 题目 到目标元素的最小距离 将字符串拆分为递减的连续值 邻位交换的最小次数 思路与算法 到目标元素的最小距离:直接遍历,维护结果就行. 将字符 ...

最新文章

  1. Intel汇编语言程序设计学习-第一章 基本概念
  2. php怎么创建事务,php事务的实现方法介绍(代码示例)
  3. node 更新_Node.js 15 正式发布,14 将支持到 2023 年
  4. 使用js如何获取treeview控件的当前选中的节点
  5. 82.开始→运行→输入的命令集锦
  6. 一对多关联映射(单向关联)见项目:me_one_to_many
  7. [极客大挑战 2019]Knife [RoarCTF 2019]Easy Calc
  8. 豆瓣再被约谈处罚150万!一年被罚20次,豆瓣到底怎么了?
  9. PHP-Open Flash Chart注意事项
  10. 综述:全国软考首遭试卷丢失 20万考生措手不及
  11. 数据结构与算法之-----栈的应用(一)
  12. word计算机基础知识试题及答案,计算机基础知识试题及答案(一)
  13. 一维码与二维码对比介绍
  14. Unity 车辆跟随路径点缓动移动
  15. 人工智能对数据分析师的影响
  16. c语言中线性与非线性,最小二乘法 线性与非线性拟合
  17. 频繁gc是什么意思_经常听到的期货黄金gc是什么意思?
  18. 2022-2028年中国密码机行业竞争现状及投资策略研究报告
  19. 计算机启动死机,电脑开机突然死机怎么回事?小编教你解决开机死机问题
  20. 转载一篇c语言深度文章 《一个“蝇量级” C 语言协程库》

热门文章

  1. Java小白的数据库爱情(二)Oracle 入门
  2. java回合制武侠手游_4款回合制手游怎么选?这款武侠新游不容错过!
  3. w ndows10输入法设置,windows10输入法设置在哪里
  4. Python连接SQLserver数据库
  5. lambda表达式与方法引用
  6. IT的成功人士学习之道
  7. DevOps5.3发布说明
  8. 【Leetcode】1062. Longest Repeating Substring
  9. Django objects.all() ,objects.get() ,objects.filter()之间的区别
  10. 关于PS选区的学习笔记