LeetCode 热题 100 | 回溯(三)

目录

1  131. 分割回文串

2  51. N 皇后


菜鸟做题,语言是 C++,感冒好了 ver.

1  131. 分割回文串

题眼:给你一个字符串 s,请你将 s 分割 成一些子串。

根据题眼可知,我们需要做的是将字符串 s 连续分割 为几段,并且 每段 都应该是回文串。而非对字符串 s 任意截取,使得截取出的部分都是回文串。

值得注意的是,单个字符也被算作回文串。

解题思路:

  1. 设置变量 begin 作为子串的开头,end = begin 作为子串的结尾
  2. 判断 begin 和 end 之间的内容(即子串)是否是回文串
  3. 若是,则将 begin 移至 end 后面,然后递归处理第二个子串
  4. 反之,则 end++,继续判断 begin 和 end 之间的内容(即子串)是否是回文串

为什么将 begin 移至 end 后面?因为 end 前面的字母是属于前一个子串的,下一个子串只能接在前一个子串的后面。

递归返回条件:字符串 s 被遍历完毕时,

  • ① 可能找出了一组符合题目要求的分割结果,立即返回
  • ② 也可能找不到一组符合题目要求的分割结果,不得不返回

返回到上一层函数后,让 end 继续向后移动,以寻找新的回文串,即新的分割方式。若找到新的回文串,则又递归进入下一层,处理下一个子串。

思路说明图:观看顺序是从左到右,从上到下

第一层函数的功能是找出第一个回文串。由于 "a" 是回文串,因此接着递归寻找第二个回文串。第二层函数的功能是找出第二个回文串。由于 "a" 是回文串,因此也接着递归寻找第三个回文串。以此类推。当对整个字符数组处理完毕时,递归层层返回。

重新回到第一层函数,上次我们找的是 "a",那么这次 end + 1,判断 "aa" 是否是回文串。由于 "aa" 是回文串,因此接着递归寻找第二个回文串。以此类推。

本题中的 “选择”,是指从 “可能的回文串” 中选择。比如:第一层函数能分割出的回文串不止一种,它可以是 "a" 也可以是 "aa",因此 end 要不断后移以遍历所有可能的选择。

class Solution {
public:vector<vector<string>> ans;vector<string> son;void helper(string s, int begin) {if (begin == s.size()) {ans.push_back(son);return;}for (int end = begin; end < s.size(); ++end) {if (isPalindrome(s, begin, end)) {son.push_back(s.substr(begin , end - begin + 1));helper(s, end + 1);son.pop_back();}}}bool isPalindrome(string s, int p, int q) {while (p <= q) {if (s[p++] != s[q--])return false;}return true;}vector<vector<string>> partition(string s) {helper(s, 0);return ans;}
};

说明:判断当前分割出的字符串是否为回文串,代码如下:

bool isPalindrome(string s, int p, int q) {while (p <= q) {if (s[p++] != s[q--])return false;}return true;
}

其实就是从左往右和从右往左的字母要一样。

2  51. N 皇后

思路说明图:

解题思路:

模仿  46. 全排列,将棋盘的每一行视为一个坑位,将每一行的每个格子视为一种选择。

Q:如何判断当前格子是否可以填入皇后?

A:根据 c、r - c 和 r + c 来判断。

位于同一主对角线上的棋格的 r - c 相同,位于同一副对角线上的棋格的 r + c 相同。因此,每填入一个皇后,我们记录它的 c、r - c 和 r + c,以避免新皇后与其产生冲突。

class Solution {
public:unordered_set<int> cols, diag1, diag2;vector<string> output;vector<vector<string>> ans;void helper(vector<string> & output, int n, int r) {if (r == n) {ans.push_back(output);return;}for (int c = 0; c < n; ++c) {if (cols.count(c) || diag1.count(r - c) || diag2.count(r + c))continue;output[r][c] = 'Q';cols.insert(c);diag1.insert(r - c);diag2.insert(r + c);helper(output, n, r + 1);output[r][c] = '.';cols.erase(c);diag1.erase(r - c);diag2.erase(r + c);}}vector<vector<string>> solveNQueens(int n) {for (int i = 0; i < n; ++i) {string s (n, '.');output.push_back(s);}helper(output, n, 0);return ans;}
};

说明:判断当前格子是否可以填入皇后的代码如下:

if (cols.count(c) || diag1.count(r - c) || diag2.count(r + c))continue;

使用三个集合 cols、diag1 和 diag2 分别记录 c、r - c 和 r + c,若当前棋格的位置信息与其中的值重复,则跳过该棋格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/549298.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式搜索引擎elasticsearch专栏一

初识elasticsearch 1.1了解ES elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在码云搜索代码 在电商网站搜索商品 在百度搜索答案 1.1.2.ELK…

Hadoop入门之Hadoop的组成

目录 Hadoop1.x和2.x的区别Hadoop组成HDFSYARNMapReduce 为什么说MR适合离线 Spark适合实时 Hadoop1.x和2.x的区别 高内聚 低耦合 Hadoop组成 HDFS HDFS-负责海量数据的存储: NameNode&#xff08;nn&#xff09;:管理真实数据的元数据的&#xff08;hdfs集群中的老大&am…

分布式事务的解决方案--Seata架构

一、Seata的XA模式 二、AT模式原理 三、TCC模式原理 四、MQ分布式事务 异步&#xff0c;非实时&#xff0c;实现最终的一致性。 四、分布式事务的解决方案

顶顶通呼叫中心中间件-群集配置方法讲解(mod_cti基于FreeSWITCH)

群集介绍 比较多的外呼或呼入系统&#xff0c;假如整个系统需要1万并发&#xff0c;单机最高就3000-5000并发&#xff0c;这时就需要多机群集了。顶顶通呼叫中心中间件使用redis数据库&#xff0c;多个FreeSWITHC(mod_cti)连接同一个redis就可以很容易的配置成群集系统。 想了…

Linux docker3--数据卷-nginx配置示例

一、因为docker部署服务都是以最小的代价部署&#xff0c;所以通常在容器内部很多依赖和命令无法执行。进入容器修改配置的操作也比较麻烦。本例介绍的数据卷作用就是将容器内的配置和宿主机文件打通&#xff0c;之后修改宿主机的配置文件就相当于修改了docker进程的配置文件&a…

Linux---基本操作命令之用户管理命令

1.1useradd 添加新用户 root用户&#xff1a;/root 普通用户&#xff1a;/home/ 创建的用户还是david&#xff0c;只是在dave文件夹下 1.2 passwd 设置密码 给用户tony设置密码: 123456 1.3 id 查看用户是否存在 查看有没有这个用户&#xff1a;id 名字 gid&#xff1a;用…

【数据可视化】Echarts官方文档及常用组件

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…

Linux——线程(4)

在上一篇博客中&#xff0c;我讲述了在多执行流并发访问共享资源的情况下&#xff0c;如何 使用互斥的方式来保证线程的安全性&#xff0c;并且介绍了Linux中的互斥使用的是 互斥锁来实现互斥功能&#xff0c;以及它的原理&#xff0c;在文章的结尾我提出了一个问题 用来引出同…

51单片机学习笔记6 数码管显示

51单片机学习笔记5 数码管显示 一、动态数码管1. 动态数码管工作原理2. 工作过程3. 原理图&#xff08;1&#xff09;数码管及74HC245&#xff08;2&#xff09;74HC138译码器 4. 74HC245介绍&#xff08;1&#xff09;**功能**&#xff08;2&#xff09;**引脚**&#xff08;3…

软件杯 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

2024同城招标投标微网站微信小程序版本源码

2024同城招标投标微网站&微信小程序版本源码 功能介绍&#xff1a; 同城招投标这套程序主要是为了解决招投标问题 用户缴纳保证金发布起来招标&#xff0c;然后商家进行认证成功后可以对招标发起投标&#xff0c;投标过程也需要缴纳保证金&#xff0c;单招标结束或者下架保…

苍穹外卖-day13:vue基础回顾+进阶

vue基础回顾进阶 课程内容 VUE 基础回顾路由 Vue-Router状态管理 vuexTypeScript 1. VUE 基础回顾 1.1 基于脚手架创建前端工程 1.1.1 环境要求 要想基于脚手架创建前端工程&#xff0c;需要具备如下环境要求&#xff1a; ​ node.js 前端项目的运行环境 学习web阶段已安…