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.mzph.cn/news/755137.shtml

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

相关文章

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

Redis各场景应用集合

应用场景 1、缓存&#xff08;Cache&#xff09;,分布式缓存 有一些存储于数据库中的数据会被频繁访问&#xff0c;如果频繁的访问数据库&#xff0c;数据库负载会升高&#xff0c;同时由于数据库IO比较慢&#xff0c;应用程序的响应会比较差。此时&#xff0c;如果引入Redis来…

面试笔记——Redis(使用场景、面临问题、缓存穿透)

Redis的使用场景 Redis&#xff08;Remote Dictionary Server&#xff09;是一个内存数据结构存储系统&#xff0c;它以快速、高效的特性闻名&#xff0c;并且它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等。它主要用于以下场景&#xff1a; 缓…

java新手练习-类的继承调用(接口,抽象类,构造函数)和枚举定义方法

1.继承 父类可以调用子类实例对象,(对于调用抽象类必须使用继承) 模版 //抽象定义一个父类抽象类 abstract class FatherAbstract{void showFatherAbstract(String color, String name, int age, double serail_abstract){System.out.println("color " color &…

Java基础-lambda表达式

lambda表达式 前言前置知识λ小故事函数式编程起源: λ演算法 概念Lambda && 匿名类无参类型的简写带参函数的简写 简写的依据自定义函数接口lambda && 匿名类JVM层面区别匿名内部类实现Lambda表达式实现推论,this引用的意义 lambda && 集合Collection…

代码随想录阅读笔记-字符串【右旋字符串】

题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符串 "a…

【STL源码剖析】【2、空间配置器——allocator】

文章目录 1、什么是空间配置器&#xff1f;1.1设计一个简单的空间配置器&#xff0c;JJ::allocator 2、具备次配置力( sub-allocation)的 SGI 空间配置器2.1 什么是次配置力2.2 SGI标准的空间配置器&#xff0c;std::allocator2.2 SGI特殊的空间配置器&#xff0c;std::alloc2.…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

OSPF外部路由及外部路由引入过程

OSPF自治域&#xff08;同运行了OSPF协议的设备&#xff09;&#xff1b;O_ASE——代表OSPF的外部路由&#xff08;优先级150&#xff09;&#xff1b;1类LSA除了描述本身的直连状态、还描述本身的设备角色。 ASBR——自治系统边界路由器&#xff1b;同种路由协议也可做路由引…

谁能成为OpenAI的现实竞争对手吗?

文 | BFT机器人 前言&#xff1a; 自从与ChatGPT一起出现以来&#xff0c;OpenAI一直主导着人工智能市场&#xff0c;但它仍处于早期阶段。人工智能的历史可以追溯到几十年之前。但2022年11月ChatGPT的发布使生成式人工智能 (GenAI) 成为人们关注的焦点。从那时起&#xff0c;…

汽车研发项目管理数字化平台之阀门管理

阀门管理&#xff0c;在汽车研发流程中占据着举足轻重的地位&#xff0c;是确保项目精细化、系统化的关键所在。这一机制的核心在于通过设立“阀门”来控制和管理研发流程中的关键节点&#xff0c;从而确保项目在质量、进度和资源等方面均符合预期目标。在汽车行业高度竞争和持…

学习网络编程No.14【数据链路层ARP理解】

引言&#xff1a; 北京时间&#xff1a;2024/3/14/9:20&#xff0c;简单聊一聊我的日常。昨天晚上十点左右更新完新的一篇文章&#xff0c;回到宿舍简简单单花了个两首歌的时间洗了个澡&#xff0c;然后为了保持形象吹了个头发&#xff0c;哈哈哈&#xff01;当然对比以前的我…

Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)

申请测试号进行调试开发&#xff0c;测试号拥有大部分服务号有的接口权限。 一、接口配置信息填写校验 这里需要填写一个URL和一个Token验证字符串 我这里是用了natapp内网穿透 将本地的后台8080端口服务映射到了 http://x7zws8.natappfree.cc https://natapp.cn/在natapp官网…

Linux(Ubuntu)下安装paddleocr详细教程

PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库&#xff0c;助力开发者训练出更好的模型&#xff0c;并应用落地。 1、 Ubuntu安装教程&#xff1a; 首先安装paddlepaddle&#xff1a;pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 一般此项不会报错…

Redis的安装和部署教程(Windows环境)

一、安装Redis服务 1、下载Redis压缩包 以下这个是我网盘里面的&#xff08;这个是v8.0版本的&#xff0c;支持导入.rdb数据文件&#xff09; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;x0f1 --来自百度网盘超级会员V5的分享 2、解压到文件夹 将下载的压缩…

【书生·浦语大模型实战营】学习笔记2

Lagent&#xff1a;智能体框架&#xff0c;实现将一个大语言模型转化为多种类型的智能体&#xff0c;更好地发挥InternLM的性能 浦语灵笔&#xff1a;视觉语言大模型 InternLM-Chat-7B智能对话Demo 环境准备 使用复制的internlm-demo环境 # 执行该脚本文件来安装项目实验环境…

Apple加速AI大跃进:最新发布的MM1 模型论文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

四川宏博蓬达法律咨询有限公司:专业引领,法律护航

在这个法治社会中&#xff0c;法律服务已成为企业和个人不可或缺的重要支持。四川宏博蓬达法律咨询有限公司凭借其专业的服务态度和丰富的法律知识&#xff0c;在法律服务领域独树一帜&#xff0c;赢得了社会各界的广泛认可。 一、公司背景实力雄厚 四川宏博蓬达法律咨询有限公…

电脑怎么快速重装系统win7

电脑重装系统是解决软件问题、提升系统性能的常用手段。随着技术发展,一键重装系统成为了许多用户的首选方法,因为它简化了繁琐的操作步骤,节省了大量时间。尤其是对于非技术人员来说,一键重装提供了一种快速高效且不易出错的系统安装方式。如果你需要快速重装win7,那么可…