LeetCode 热题 100 | 回溯(三)

news2024/11/15 13:55:39

目录

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.coloradmin.cn/o/1528324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度观察2024中国系统架构师大会(SACC)

今年的中国系统架构师大会&#xff08;SACC&#xff09;在我所在的城市广州举办&#xff0c;很荣幸受邀参加。这次能接触到国内最优秀的架构师&#xff0c;学习他们的架构思想和行业经验。对我而言非常有意义。 大会分为上下午共4场&#xff0c;我参加了上午的多云多活架构设计…

Altair® Activate® 多学科系统仿真

Altair Activate 多学科系统仿真 Altair Activate 是一个开放且灵活的集成平台&#xff0c;用于系统仿真综合系统。Altair Activate 基于针对信号块、面向对象的物理组件、电气和电子系统的混合框图建模环境&#xff0c;支持在整个开发周期中进行多物理场分析。 全面支持 数学…

目标检测——PP-YOLOE算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…

针对元宇宙概念的兴起,普通人能不能参与?

元宇宙是一种虚拟现实空间&#xff0c;由数字技术构建&#xff0c;让人们可以在其中进行交互和沟通。通俗点说&#xff0c;元宇宙就像是一个类似于《黑镜》剧集中的“星空游乐园”的虚拟世界&#xff0c;我们可以在其中自由探索、玩乐、交互、创造。 在元宇宙中&#xff0c;我们…

【虚拟化简介】

文章目录 虚拟化简介什么是虚拟化&#xff1f;Hypervisor概念Hypervisor模型 虚拟化技术的分类软件虚拟化和硬件虚拟化软件虚拟化技术硬件虚拟化技术 参考资料 虚拟化简介 什么是虚拟化&#xff1f; CPU处理能力的飞速提升。 它的另一面也就意味着&#xff0c; 个人单独拥有一…

没有在中国境内注册,但是在境内开展业务,或向境内提供产品或服务的,是否属于境内运营?

没有在中国境内注册&#xff0c;但是在境内开展业务&#xff0c;或向境内提供产品或服务的&#xff0c;是否属于境内运营&#xff1f; 判断是否属于“境内运营”&#xff0c;不以是否在境内注册为判断依据&#xff0c;如果没有在我国境内注册的网络运营者&#xff0c;但在我国境…

基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 ​编辑2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到matlab显示结果如下&#xff1a; matlab的对比测试结果如下&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a…

FMEA可以应用在什么行业——FMEA软件

免费试用FMEA软件-免费版-SunFMEA FMEA&#xff0c;即故障模式与影响分析&#xff08;Failure Modes and Effects Analysis&#xff09;&#xff0c;是一种预防性的质量工具&#xff0c;用于识别产品或过程中潜在的故障模式&#xff0c;评估其对系统的影响&#xff0c;并优先排…

Python对象作为参数传递到函数/方法的机制

以代码为例 class Person:name Noneage None# 分析对象作为参数传递到函数/方法的机制 def f1(person):print(f"2. person的地址&#xff1a;{id(person)}")person.name "james"person.age 1p1 Person()p1.name "jordan" p1.age 21 pri…

24计算机考研调剂 | 【官方】桂林理工大学(11自命题、22自命题)

桂林理工大学信息工程与科学学院招收调剂 考研调剂补充信息 一、招收专业 计算机科学与技术&#xff08;学硕&#xff09;、软件工程&#xff08;学硕&#xff09;、计算机技术&#xff08;专硕&#xff09;、人工智能&#xff08;专硕&#xff09;、软件工程&#xff08;专…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…

C语言之我对结构体与联合体的认识

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

APP广告变现初期,广告测试怎么做?

广告变现能给应用带来收入增长的一条非常有效的途径&#xff0c;同时可以帮助变现困难的产品类型最快实现盈利&#xff0c;例如付费下载、工具类产品等。 广告测试是APP广告变现中必不可少的一步&#xff0c;广告测试可以用来验证增减广告位会不会引起用户反感、对接广告平台能…

如何解决MySQL死锁(看懂MySQL锁日志)

有时候系统在生产运行着&#xff0c;会突然爆出 [40001][1213] Deadlock found when trying to get lock; try restarting transaction 这个时候每个人都会很紧张&#xff0c;因为死锁会影响DB性能&#xff0c;严重时甚至拖垮整个系统。在实际的环境中&#xff0c;很多服务会共…

JMeter压测SpringBoot项目

压力测试架构图如下: 配置JMeter 在JMeter的bin目录,双击jmeter.bat 新建一个测试计划,并右键添加线程组: 进行配置 一共会发生4万次请求。 ctrl + s保存; 添加http请求: 配置http请求: 配置断言,来判断当前请求是否成功: 正常响应如下:

EtherCAT开源主站 IGH 介绍及主站伺服控制过程

目录 前言 IGH EtherCAT主站介绍 主要特点和功能 使用场景 SOEM 主站介绍 SOEM 的特点和功能 SOEM 的使用场景 IGH 主站 和 SOEM对比 1. 功能和复杂性 2. 资源消耗和移植性 3. 使用场景 EtherCAT 通信原理 EtherCAT主站控制伺服过程 位置规划模式 原点复归模式…

金融知识分享系列之:ATR指标

金融知识分享系列之&#xff1a;ATR指标 一、ATR指标二、指标原理三、海龟交易法应用1.计算开仓数量2.制定止损/加仓规则 四、ATR指标总结 一、ATR指标 利用ATR指标计算仓位&#xff0c;设置止损的规则名称&#xff1a;平均真实波动幅度参数&#xff1a;(默认14)组成&#xff…

CMeet系列技术生态沙龙---《探索未来:生成式AI赋能千行百业·杭州》

当前数字化浪潮下&#xff0c;生成式AI技术正成为推动产业升级、提升竞争力的关键力量。为深入探索未来AI技术的赋能作用&#xff0c;促进技术生态的繁荣与发展&#xff0c;CSDN-CMeet系列沙龙活动旨在搭建一个交流与探索的平台&#xff0c;通过分享前沿研究成果和应用案例&…

OpenCV实现OCR图片文本检测

一、操作步骤 把左边这样的图片&#xff0c;通过仿射变换转换成右边那样的图片。 然后再通过pytesseract读取图片内容得到图片中的文本就好了。 需要使用到&#xff1a; 仿射变换ocr识别 注&#xff1a;本文使用现成图片&#xff0c;轮廓检测较为明显&#xff0c;若是自己拍…

Css 样式记录

实现两栏布局如图所示样式&#xff1a; 方法1&#xff1a; <div style"display: flex; justify-content: space-between; width:100%;"> <div>1</div> <div>2</div> </div> 方法2&#xff1a; <div style"display: fle…