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.mfbz.cn/a/468578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

医保智慧购药:探索医保买药小程序技术开发与应用

如今&#xff0c;医保智慧购药成为了一种趋势&#xff0c;尤其是医保买药小程序的技术开发和应用&#xff0c;为患者提供了更加便捷、高效的医药购买体验。 医保买药小程序是一种基于手机移动终端的应用程序&#xff0c;它通过智能化的算法和医保系统的对接&#xff0c;为患者…

gPTP简介

1、gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议 gPTP&#xff08;generalized precision time protocol&#xff09;广义时钟同步协议&#xff0c;即IEEE 802.1AS协议。它是IEEE 1588协议的延伸&#xff0c;可以为TSN提供全局精准…

Legacy|电脑Windows系统如何迁移到新安装的硬盘?系统迁移详细教程!

前言 前面讲了很多很多关于安装系统、重装系统的教程。但唯独没有讲到电脑换了新的硬盘之后&#xff0c;怎么把旧系统迁移到新的硬盘上。 今天小白就来跟各位小伙伴详细唠唠&#xff1a; 开始之前需要把系统迁移的条件准备好&#xff0c;意思就是在WinPE系统下&#xff0c;可…

【Linux】Linux权限详解(权限管理-目录权限-粘滞位)

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.Linux权限的概念 2.Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 ​编辑 1.文件类型 2.基本权限 2. 3 文件权…

android adb 实时画面 和操作

1. 下载 scrcpy 建议 windows10 用户 点击链接下载 不然可能会提示缺少部分 dll https://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.ziphttps://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.zip windo…

Java语言: JVM

1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间&#xff08;Metaspace&#xff09; 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…

递推算法C++

所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。从已知条件出发逐步推到问题结果&#xff0c;此种方法叫顺推…

Linux:网络的初步认知

文章目录 网络的认知如何理解协议网络分层OSI模型TCP/IP五层(或四层)模型网络传输的基本流程协议的参与局域网通信原理 本篇将会引入到网络的话题 网络的认知 第一个问题是&#xff0c;网卡是文件吗&#xff1f;答案是显然的&#xff0c;在Linux下一切皆文件&#xff0c;基于…

大模型日报 3月14日

资讯 研究 智能体的ChatGPT时刻&#xff01;DeepMind通用AI向人类玩家进化&#xff0c;开始理解游戏 https://mp.weixin.qq.com/s/-GNZaY9vPQJCJUD7WGTjGA 视频游戏是 AI 系统的重要试验场。与现实世界一样&#xff0c;游戏也是丰富的学习环境&#xff0c;具有反应灵敏的实…

Hive SQL必刷练习题:向用户推荐朋友收藏的商品(两种思路)

问题需求&#xff1a; 需要请向所有用户推荐其朋友收藏但是用户自己未收藏的商品&#xff0c;请从好友关系表&#xff08;friendship_info&#xff09;和收藏表&#xff08;favor_info&#xff09;中查询出应向哪位用户推荐哪些商品。期望结果如下&#xff1a; 1&#xff09;…

【算法专题突破】--- 动态规划 --- 第 N 个泰波那契数 三步问题(1)

1.第 N 个泰波那契数 1.题目解析 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 定义状态表 首先&#xff0c;我们要明白这道题的核心是找出一个序列中的数&#xff0c;这个序列遵循特定的规律&#xff1a;每个数…

简析|创业老隋分享的人力RPO项目如何?

在当今社会&#xff0c;创业热潮席卷而来&#xff0c;各类项目层出不穷。近日&#xff0c;创业老隋分享的人力RPO项目引起了广泛关注。那么&#xff0c;这个项目究竟如何呢?是否靠谱?经过深入了解和分析&#xff0c;我认为这个项目是靠谱的。 首先&#xff0c;从项目的背景和…

idea远程试调jar、远程试调war

idea远程试调jar、远程试调war 目的&#xff1a;测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…

angularjs 指令实现自定义滚动条

场景&#xff1a;横向商品栏&#xff0c;把原有的滚动条改成自定义的样式&#xff0c;并且给两边加上箭头可以调整&#xff0c;可以拖动商品和滚轮实现滚动条效果。 js appService.directive(customScrollbar, function() {return {restrict: A,transclude: true,scope: {ena…

Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别?

Docker简介 前言 前端有必要学习Docker吗&#xff1f;有&#xff01;&#xff01;不仅要学Docker&#xff0c;还要学习Kubernetes (K8s)&#xff0c;Jenkins 那问题来了&#xff0c;Docker,k8s,jenkins到底要先学习那个呢&#xff1f;当然是Docker 总结来说&#xff0c;先学习…

Cookie 信息泄露 Cookie未设置http only属性 原理以及修复方法

漏洞名称&#xff1a;Cookie信息泄露、Cookie安全性漏洞、Cookie未设置httponly属性 漏洞描述&#xff1a; cookie的属性设置不当可能会造成系统用户安全隐患&#xff0c;Cookie信息泄露是Cookiehttp only配置缺陷引起的&#xff0c;在设置Cookie时&#xff0c;可以设置的一个…

大厂设计师视角下的产品设计完整流程解析!

我相信在激烈的市场竞争中&#xff0c;我们看到了很多半途而废的竞争产品&#xff0c;产品设计过程可以为产品提供很好的解决方案。什么是产品设计过程&#xff1f;产品设计过程由以用户为中心的数字产品设计过程组成&#xff0c;遵循多学科方法。其主要目标是创造优秀的产品&a…

边缘计算+WEB端应用融合:AI行为识别智能监控系统搭建指南 -- 整体介绍(一)

专栏目录 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 整体介绍&#xff08;一&#xff09; 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 边缘设备图像识别及部署&#xff08;二&#xff09; 边缘计算WEB端应用融合&#xf…

语言、支付、社交:独立站本地化攻略全揭秘,助您征服海外市场

随着全球化的推进和互联网技术的飞速发展&#xff0c;独立站营销已成为许多企业开拓国际市场、提升品牌影响力的重要手段。然而&#xff0c;要在不同国家和地区取得成功&#xff0c;必须制定精准的本地化营销策略&#xff0c;以迎合目标市场的文化和习惯。本文Nox聚星将和大家探…

MB10F-ASEMI适配器专用整流桥MB10F

编辑&#xff1a;ll MB10F-ASEMI适配器专用整流桥MB10F 型号&#xff1a;MB10F 品牌&#xff1a;ASEMI 封装&#xff1a;MBF-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;中小功率 芯片个数&#xff1a;4 …