当前位置: 首页 > news >正文

算法题(回溯)

一、题目

1、括号生成(LC 22)

2、单词搜索(LC 79)

二、题解

1、括号生成(LC 22)

(1)分析

采用回溯的思想解决。递归方法包括 left、right、ans、path、n 五个核心参数,其中 left 与 right 分别记录已使用的左、右括号数量,ans 用于存储所有合法的括号组合结果,path 为固定长度的字符数组,用于暂存单组括号组合,n 为需要生成的括号对数。

递归边界条件:右括号使用次数达到 n,此时左括号必然也使用了 n 次,形成完整合法组合,将 path 转换为字符串加入结果集后回溯至上一层。递归过程中,当左括号使用次数小于 n 时,可向 path 中添加左括号;当右括号使用次数小于左括号时,可添加右括号。一次递归结束也无需恢复现场,因为下一次的获取的括号组合会覆盖上一次的组合。

(2)解答
class Solution { public List<String> generateParenthesis(int n) { //初始化 List<String> ans = new ArrayList<>(); //结果列表,存放最终结果 char[] path = new char[2 * n]; //存放每一种括号组合 dfs(0, 0, ans, path, n); return ans; } //当前使用了left个左括号,right个右括号 public void dfs(int left, int right, List<String> ans, char[] path, int n){ if(right == n){ //path已经放满,获取了一种括号组合,添加到结果列表中 ans.add(new String(path)); return; } if(left < n){ path[left + right] = '('; dfs(left + 1, right, ans, path, n); } if(right < left){ //左括号数要小于右括号数,才可以选择 path[left + right] = ')'; dfs(left, right + 1, ans, path, n); } } }

2、单词搜索(LC 79)

(1)分析

使用回溯方法解决。相较于基础回溯算法,这题多了两个参数 i, j 来表示搜索位置,参数 k 表示字符的下标。通过两层循环遍历矩阵的每一个位置,以每个位置作为起点启动深度优先搜索,若某次搜索返回 true,则证明矩阵中存在目标单词,说明board数组中含有Word的字符组合,直接返回最终结果。

递归边界条件:board数组当前位置的字符与word的对应字符不相等,直接返回 false 终止当前分支;如果相等,且 k 值达到字符数组最大下标,说明board数组中含有Word字符的组合,返回true。对于遍历到的每个board数组中的位置,将当前访问的矩阵位置置零作为访问标记,在此次递归过程不能再继续访问,四个方向递归完成后再恢复现场,确保不影响下一次递归。

(2)解答
class Solution { static int[][] dir = {{-1, 0},{1, 0},{0, -1},{0, 1}}; //方向:上下左右 public boolean exist(char[][] board, String word) { //初始化 char[] wordChar = word.toCharArray(); for(int i = 0; i < board.length; i++){ //遍历board中每个元素 for(int j = 0; j < board[i].length; j++){ if(dfs(i,j,0,board,wordChar)){ return true; } } } return false; } public boolean dfs(int i, int j, int k, char[][] board, char[] wordChar){ if(board[i][j] != wordChar[k]){ //当前元素不符合对应字符 return false; } if(k == wordChar.length -1){ //当前元素符合对应字符,且为最大下标 return true; } board[i][j] = 0; //标记当前元素为已使用的 for(int[] d : dir){ //向四个方向递归 int x = i + d[0]; int y = j + d[1]; if(x>=0 && x<board.length && y>=0 && y<board[x].length &&dfs(x,y,k+1,board,wordChar)){ return true; } } board[i][j] = wordChar[k]; //恢复现场 return false; } }
http://www.jsqmd.com/news/800961/

相关文章:

  • NVIDIA Profile Inspector完整教程:免费解锁显卡隐藏性能的终极指南
  • 2026年超声波清洗机费用解析,哪家性价比高 - 工业品牌热点
  • 2026年uv固化机选购指南,怎样挑选合适的uv固化机? - mypinpai
  • 2026年回收离心机品牌企业排名,苏皖江虎再生资源上榜 - mypinpai
  • 小熊猫Dev-C++:5分钟搞定C++开发环境的终极解决方案 [特殊字符]
  • String、StringBuilder、StringBuffer 学习与深入
  • Bitloops:用业务逻辑即代码革新复杂系统开发
  • 体系认证咨询公司如何选?中安质环认证江苏中心靠谱吗? - 工业品牌热点
  • 构建本地语音智能体:基于Go与OpenClaw的实时交互系统
  • 选购模具设计服务有哪些要点? - mypinpai
  • PID调参总调不好?试试用Simulink的自动整定工具,5分钟找到最优参数
  • 从“能用”到“可靠”:基于SonarQube与Jenkins的Java代码质量防线构建实战
  • 选购无人机培训包就业服务,如何选择 - 工业品牌热点
  • 别再只懂PCA了!用Python手写LDA,从鸢尾花分类实战看监督降维的威力
  • 3步实现iOS设备虚拟定位:跨平台工具完全指南
  • 不想卷开发了!程序员 90 天转行网安学习路线完整版
  • GitHub 被分号击穿信任防线,AI 逆向工具敲响闭源系统安全警钟
  • 2026年中国靠谱的模具设计公司排名:寅动智能有实力吗? - mypinpai
  • 3步掌握NBTExplorer:从Minecraft数据恐惧到编辑专家的完整指南
  • NAND闪存市场演进:从消费电子到AI时代的技术博弈与产业洞察
  • 口碑好的无人机培训包就业公司推荐——华研科技 - 工业品牌热点
  • ARM A64指令集架构解析与优化实践
  • 别再傻傻分不清TPS和QPS了!性能测试新手必看的5个核心指标实战解读
  • 知识蒸馏与Koopman算子结合的神经网络线性化方法
  • 2026年宁波首饰黄金回收费用,宁波瑞谨奢侈品口碑不错 - mypinpai
  • 5分钟搞定Windows风扇控制:FanControl让你的电脑散热更智能更安静
  • 2026年浙江泰平主要做光缆配线架吗?口碑怎么样? - mypinpai
  • 终极maya-glTF导出攻略:从3D建模到Web 3D的无缝转换秘籍
  • 别再被异常值带偏了!聊聊机器学习中稳健回归的‘抗揍’算法:IRLS
  • 直播人力成本居高不下?2026十大AI数字人直播平台推荐实现长效运营