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

leetcode思路-回溯最后一节(131.分割回文串、51.N皇后)

131.分割回文串

给你一个字符串s,请你将s分割成一些 子串,使每个子串都是回文串。返回s所有可能的分割方案。

思路:

用成员变量ans和path来维护所有达到标准的分割子串集合以及当前分割子串集合

枚举子串的结束位置判断是否回文

递归结束条件:

子串的起点等于s的长度,即s已经分割完毕,加入当前路径到ans中

当前递归做的事情:

列举当前起点所有可能的终点,判断是否有回文子串,如果有,对字符串进行分割,并将剩下的字符串起点递归传入下一次继续分割寻找回文子串,注意递归后面要恢复现场。

class Solution { List<List<String>> ans; List<String> path; public List<List<String>> partition(String s) { ans = new ArrayList<>(); path = new ArrayList<>(); DFS(0,s); return ans; } //传入剩下未被分割的部分和字符串 public void DFS(int i,String s){ if(i == s.length()){ ans.add(new ArrayList<>(path)); return; } //列举所有可能的终点 for(int j = i;j < s.length();j++){ //如果当前终点符合,递归判断剩下的字符串是否能达到符合条件 if(isPalindrome(i,j,s)){ path.add(s.substring(i, j + 1)); DFS(j + 1,s); //恢复现场 path.remove(path.size() - 1); } } } public boolean isPalindrome(int l,int r,String s){ while(l < r){ if(s.charAt(l++) != s.charAt(r--)){ return false; } } return true; } }

51.N皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数n,返回所有不同的n皇后问题的解决方案。

每一种解法包含一个不同的n 皇后问题的棋子放置方案,该方案中'Q''.'分别代表了皇后和空位。

思路:

要解决N皇后问题,首先是处理1.同行冲突 2.同列冲突 3.同斜线冲突

1.同行冲突:

在构建遍历数组时,直接规定一行只存放一个皇后,这样的稀疏矩阵可以压缩成数组,下标表示皇后所在的行数,数组值表示该行皇后所在的列数

2.同列冲突

构建数组 isChoose[n]存储该列有没有放皇后

3.同斜线冲突

因为根据推理可得,↗ 方向,如果冲撞,则行号加列号为常数,这样的常数理论上有2n - 1个,因此构建数组 diag1[2n - 1]。

↖方向,如果冲撞,则行号减列号为常数,这样的常数理论上有2n - 1个,因此构建数组 diag2[2n - 1]。

构建函数DFS(r:标记当前放置到第几个皇后 n:传入一共有几个皇后 path:存储所有放置过的皇后位置信息 isChoose:用来排除同列冲突 diag1、diag2:用来排除斜线冲突)

使用成员变量ans存储所有可能的皇后放置组合

递归结束条件:

所有皇后放置完成 r==n

当前递归做的事情:

遍历每一个列看能不能把当前的皇后放进去,剪枝去掉有行冲突斜线冲突的路径(注意这里diag2要加一个偏移量、因为行号减列号有可能是负的,负的值一共有 n-1个,故加上n-1,让原本的数组下标范围由[-(n -1 ),n-1]到[0,2n -1])

如果能放进去,那么进入下一个递归放下一个皇后,注意递归完后要恢复现场

List<List<String>> ans; public List<List<String>> solveNQueens(int n) { ans = new ArrayList<>(); //path[n] = m:表示在第n行第m列放了一个皇后,因为我们一行只放一个皇后,所以可以这样简化存储 int[] path = new int[n]; //当前列有没有放皇后 boolean[] isChoose = new boolean[n]; //↗ 方向,如果冲撞,则行号加列号为常数,此斜对角线最多有2n - 1个元素,记录当前斜对角线有没有放皇后 boolean[] diag1 = new boolean[2*n - 1]; //↖方向,如果冲撞,则行号减列号为常数,此斜对角线最多有2n - 1个元素,记录当前斜对角线有没有放皇后 boolean[] diag2 = new boolean[2*n - 1]; DFS(0,n,path,isChoose,diag1,diag2); return ans; } public void DFS(int r,int n,int[] path,boolean[] isChoose,boolean[] diag1,boolean[] diag2){ //如果皇后已经放完,添加当前路径到ans中 if(r == n){ ans.add(new ArrayList<>(build(path))); return; } //遍历每一个列看能否将当前行的元素放进去 for (int c = 0; c < n; c++) { //剪枝 if(!isChoose[c] && !diag1[r + c] && !diag2[r - c + n - 1]){ path[r] = c; isChoose[c] = diag1[r + c] = diag2[r - c + n - 1] = true; DFS(r + 1,n,path,isChoose,diag1,diag2); isChoose[c] = diag1[r + c] = diag2[r - c + n - 1] = false; } } } public List<String> build(int[] path){ int n = path.length; List<String> res = new ArrayList<>(); for(int i:path){ char[] str = new char[n]; for(int j = 0;j < n;j++){ str[j] = j == i ? 'Q':'.'; } res.add(new String(str)); } return res; }
http://www.rkmt.cn/news/1411829.html

相关文章:

  • 2026最新达州市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 2026最新都江堰市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 解锁Windows远程桌面多用户限制:RDPWrap完整部署与优化指南
  • 2026最新的北京电动车运输公司怎么选?推荐一下 哪家好 - 奔跑123
  • 别再只用TB6612了!用DRV8833给Arduino智能小车做电机驱动,实测对比与避坑指南
  • 如何快速解决编码乱码问题:终极跨平台GBK转UTF-8解决方案
  • 5个核心功能解锁专业级VRM创作:Blender插件全面指南
  • 3分钟掌握猫抓:浏览器资源嗅探的终极解决方案
  • 高价回收支付宝红包的秘诀:你需要知道这些平台! - 团团收购物卡回收
  • 2026最新大理市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 2026最新敦化市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • CANoe Test Module避坑指南:.vxt与.can文件联调那些容易踩的‘坑’
  • 2026最新大连市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 告别手动拷贝!用Ansible自动化部署Spark 3.x集群(基于CentOS 7)
  • 2026最新阜阳市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 告别空洞视差图:OpenCV C++双目测距中WLS滤波器的实战调优指南
  • 2026最新鄂州市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 深度解析UEFI固件:3个实战场景教你掌握系统底层调试
  • 手把手教你用Simulink生成电力系统11类故障数据,附Python分类实战代码
  • Git操作失误的终极后悔药:ugit一键撤销指南
  • 深入主板时钟:图解Windows/Linux双系统时间不同步(UTC vs Localtime)的根本原因与选型建议
  • Unity Recorder隐藏玩法揭秘:如何用它给你的游戏角色制作‘证件照’和360°展示视频?
  • 从‘挖土填土’到最优传输:用大白话和NumPy一步步实现Wasserstein距离计算
  • 技术解析 | FVC:特征空间视频压缩新范式,如何用可变形卷积与多帧融合突破传统编码瓶颈?
  • 别再纠结了!家用服务器选PVE还是unRaid?从NAS玩家视角聊聊我的踩坑心得
  • GetQzonehistory完整指南:3步轻松备份你的QQ空间历史记忆
  • 2026最新丹东市黄金回收白银回收铂金回收店铺实力口碑排行榜TOP5;K金+金条+银条+首饰回收靠谱门店及联系方式推荐 - 前途无量YY
  • 三步解锁音乐自由:开源NCM转换工具让你掌控自己的音乐收藏
  • 猫抓浏览器扩展:让网络视频无处可逃的智能捕获神器
  • 13.给Hermes一个不会丢的浏览器身份