【蓝桥杯速成】| 10.回溯切割
前面两篇内容我们都是在做有关回溯问题的组合应用
今天的题目主题是:回溯法在切割问题的应用
题目一:分割回文串
问题描述
131. 分割回文串 - 力扣(LeetCode)
给你一个字符串 s
,请你将 s
分割成一些 子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
解题步骤
在做这题之前我们需要明确回文串是什么东西👇
那么我们解决这个问题就可以分为分割字符串和判断回文串两个part
运用回溯法分割字符串其实和组合问题是类似的思路
我们需要按照字符串顺序,在所有可能位置砍上一刀,形成不同的字符串碎片
那么为了不错过任何一种可能,就需要按顺序遍历
下面就来尝试使用回溯三部曲!
1.确定函数返回值及参数
依旧使用backtracking这个名字,没有返回值的要求,参数呢传入我们需要使用的字符串s以及一个开始索引startindex即可
这个开始索引是不断变大的,意味着每次砍第一刀下去,第一个碎片的长度在慢慢变大,这也是我们有序分割的重要环节
void backtracking(string s,int startindex)
2.确定终止条件
按照最简单的思路,和之前的组合问题一样,我们会在叶子结点取到该过程的一个答案,再做个对应题目限制的判断,合适就加入result中,
那么我们的分割也是这样,在叶子节点结束分割,把整个字符串剁碎了,
但需要注意的是,在叶子节点我们得到的不是碎片,而是虽然碎了但仍旧可以拼成完整s的组合体
就像你买了一只烤鸭,咔咔剁了几刀,你拿到手的是所有鸭子碎片而不是只有一个鸭屁股
那么在这种情况下,加入判断回文子串的代码好像有点不方便
所以我们改为在单层递归的时候做判断而不是在终止条件做判断
这样做同时也更省事了,如果你切了一刀发现这个不是回文串就没必要再切下去了
就好比切到鸭屁股的话扔掉就好了,没必要把鸭屁股也剁碎留着
还有一点需要明确的是分割完毕的表示方法,
在参数列表中我们不断传递的startindex实际上就对应我们砍下去的那一刀,
那么只要这个索引大于等于回文串长度就是切完了
if(startindex>=s.size()){
result.push_back(path);
return;
}
3.确定单层遍历操作
还是同样的逻辑,最外层确定第一刀位置
切下来以后加入path中,再递归切第二刀...
递归结束后需要pop加入值,做一个回溯
除了以上切割操作,我们还需要加入判断回文串的代码
这一个部分为使效率最大化可以加在把碎片加入path的代码前
也就是说符合回文才加入path,否则直接return
判断回文串我们可以另设函数所以单层遍历操作应该如下:
for(int i=startindex;i<s.size();i++){
if(isPalindrome(...){//这个函数等会再想!
string str = s.substr(startindex,i-startindex+1);//当前碎片是【startindex,i】
path.push_back(str);//是回文串!切下来放进path中!
}else{
continue;//不是就跳出!
}
backtracking(s,i+1);
path.pop_back();
}
补充:
s.substr(pos, len)
substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。
ok那么回溯算法的步骤我们已经完成了,还剩下判断回文串的逻辑需要写
4.判断回文串
按照回文串的概念,我们只需要一个指针从头开始,一个指针从尾开始
不断同频比较两个字符是否相等就可以了
那么需要的参数就是这个字符串碎片
返回值设为bool类型
bool isPalindrome(string s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
if(s[i] !=s[j]){
return false;
}
}
return true;
}
合并所有代码,并在主函数中传参调用即可!完整代码看下面👇!
code
class Solution {
public:vector<string> path;vector<vector<string>> result;bool isPalindrome(string s,int start,int end){for(int i=start,j=end;i<j;i++,j--){if(s[i]!=s[j]){return false;}}return true;}void backtracking(string s,int startindex){if(startindex>=s.size()){result.push_back(path);return;}for(int i=startindex;i<s.size();i++){if(isPalindrome(s,startindex,i)){string str=s.substr(startindex,i-startindex+1);path.push_back(str);}else{continue;}backtracking(s,i+1);path.pop_back();}}vector<vector<string>> partition(string s) {backtracking(s,0);return result;}
};
题目二:复原IP地址
问题描述
93. 复原 IP 地址 - 力扣(LeetCode)
有效 IP 地址 正好由四个整数(每个整数位于 0
到 255
之间组成,且不能含有前导 0
),整数之间用 '.'
分隔。
- 例如:
"0.1.2.201"
和"192.168.1.1"
是 有效 IP 地址,但是"0.011.255.245"
、"192.168.1.312"
和"192.168@1.1"
是 无效 IP 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000" 输出:["0.0.0.0"]
示例 3:
输入:s = "101023" 输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
s
仅由数字组成
解题步骤
参照上一题,我一开始写了以下代码,
主要思路就是无情分割,直到最后,
在每一步分割中使用函数判断是否符合要求
合理就加入path,逐渐组成IP地址
最后在叶子节点处加入正确的IP到result中
但是发现在单层递归中很难处理,
所以我们需要改变一下整个回溯的过程,按照这个题目的特点,给出量身定制的方案
class Solution {
public:
string path;
vector<string> result;
bool isOK(string str){
if(str.empty() || str.size()>3 || str[0]=='0'){
return false;
}
int num=stoi(str);
return num>=0&&num<=255;
}
void backtracking(string s,int startindex){
if(startindex>=s.size()){
result.push_back(path);
return;
}
for(int i=startindex;i<s.size();i++){
string str=s.substr(startindex,i-startindex+1);
if(isOK(str)){
path+=str;
//@#@¥¥#%#!@@¥#@%!@?????
}else{
break;
}
backtracking(s,i+1);
path.pop_back();
}
}
vector<string> restoreIpAddresses(string s) {
if(s.size()<4 || s.size()>12){
return result;
}
backtracking(s,0);
return result;
}
};
再审审题!
IP地址是只能有4段的,每一段不超过3个数字,
所以这里我们需要把段数作为切割完成的标志,不能再用索引指到最后,
这样就相当于做数学证明题有条件没用上,那一般来说都是证不出来的!!!
那么和段数有关的还有IP地址中的 '.' (点),
为了一举两得(实现判断段数和加点)我们可以用点数来代表段数,
点数为3意味着段数为4嘛!
重新走一边回溯三部曲
1.确定函数返回值及参数
按照上面的思路,我们得加入段数作为参数,搭配startindex共同表示分割情况
startindex关乎下刀点,不能丢掉,把刀丢了还怎么切嘛!
void backtracking(string s,int startindex,int pointnum)
2.确定终止条件
上面已经捋清楚了:点数为3意味着段数为4
但是加入第三个点后我们还没有判断剩下部分,也就是第四段是否符合要求
所以这个最后一部分的合法性要放在这个终止条件中进行判断
合法后再加入到result中
if(pointnum==3){
if(isValid...){//判断合法性等会再说!
result.push_back(s);
}
return;
}
3.确定单层遍历操作
在单层遍历中我们需要往s中加点(题目说了可以通过在 s
中插入 '.'
来形成),修改pointnum,递归,回溯
最外层遍历依旧代表第一刀(或者说上一刀)的位置,
这样才能确保第二🔪是从剩下的部分切的
切下来一段就需要判断是否合法
如果合法,在s的这个位置后面加上点
再让pointnum+1
递归backtracking函数
pointnum回溯,
s回溯
如果不合法,那么直接结束
for(int i=startindex;i<s.size();i++){
if(isValid...){
s.insert(s.begin()+i+1,'.');//加点
pointnum++;
backtracking(s,i+2,pointnum);//加入点后要再后挪一位!
pointnum--;
s.erase(s.begin()+i+1);
}
else
break;
}
4.编写判断合法性函数
作为一个判断类的函数,返回值肯定是bool类型,
参数是为了传入待判断的片段,所以依旧是s,start,end
在函数体中利用if 判断IP地址一段的数字区间是否在[0,255],每一段开头第一个是否为0,区间长度是否小于等于3,该片段是否为空
否就返回false,都没有踩雷就返回true
bool isValid(string& s,int start,int end){
if (start > end || end - start + 1 > 3) {
return false; // 片段为空或长度超过3
}
if (s[start] == '0' && start != end) {
return false; // 前导0不合法
}
string str = s.substr(start, end - start + 1);
int num = stoi(str);
return num >= 0 && num <= 255;
}
最后整合代码,传入对应参数,在主函数中调用即可,
此外,在主函数中还可以加入一个剪枝,
如果字符串长度明显不符合IP地址的长度就不用调用回溯算法了
if(s.size()<=0 || s.size()>12)
return result;
完整代码在下方!
code
class Solution {
public:vector<string> result;bool isValid(string& s,int start,int end){if (start > end || end - start + 1 > 3) {return false; // 片段为空或长度超过3}if (s[start] == '0' && start != end) {return false; // 前导0不合法}string str = s.substr(start, end - start + 1);int num = stoi(str);return num >= 0 && num <= 255;} void backtracking(string s,int startindex,int pointnum){if(pointnum==3){if(isValid(s,startindex,s.size()-1)){//最后一段!result.push_back(s);}return;}for(int i=startindex;i<s.size();i++){if(isValid(s,startindex,i)){s.insert(s.begin()+i+1,'.');//加点pointnum++;backtracking(s,i+2,pointnum);pointnum--;s.erase(s.begin()+i+1);}elsebreak;}}vector<string> restoreIpAddresses(string s) {if(s.size()<=0 || s.size()>12)return result;backtracking(s,0,0);return result;}
};
相关文章:
【蓝桥杯速成】| 10.回溯切割
前面两篇内容我们都是在做有关回溯问题的组合应用 今天的题目主题是:回溯法在切割问题的应用 题目一:分割回文串 问题描述 131. 分割回文串 - 力扣(LeetCode) 给你一个字符串 s,请你将 s 分割成一些 子串ÿ…...
【Spring】深入理解 Spring 事务管理
文章目录 一、事务的基本概念原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) 二、Spring 事务管理的优势简化事务管理代码提供多种事务管理方式整合…...
java学习笔记6
按住shift键,选择开始的一位和最后结束的一位来全选 面向对象特征之二:继承性(inheritance) 面向对象特征之二:继承性1.继承性的理解 > 生活上:财产的继承、颜值的继承 > 代码层面:> 自上而下:定义了一个类A,在定义另一个类B时&…...
人工智能在现代科技中的应用和未来发展趋势
人工智能(Artificial Intelligence,AI)是一种模拟人类智能思维和行为的技术,已经在现代科技中得到广泛应用。以下是人工智能在现代科技中的应用和未来发展趋势: 应用: 机器学习:机器学习是人工…...
第二十一章:模板与继承_《C++ Templates》notes
模板与继承 重点和难点编译与测试说明第一部分:多选题 (10题)第二部分:设计题 (5题)答案与详解多选题答案:设计题参考答案 测试说明 重点和难点 21.1 空基类优化(EBCO) 知识点 空基类优化(Empty Base Cla…...
STC89C52单片机学习——第35节: [16-1] AD/DA
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.23 51单片机学习——第35节: [16-1] AD/DA 前言开发板说明引用解答和科普一、AD问题…...
算法-最大公约数
1、约数: 1.1 试除法求约数 原理:只需要遍历最小的约数即可,较大的那个可以直接算出来。 import java.util.*; public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {int t sc.nextIn…...
在 SaaS 应用上构建 BI 能力的实战之路
SaaS 产品在持续运营过程中积累了大量数据,这些数据不仅是数字的记录,更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此,大部分的 SaaS 产品在发展到一定阶段后,都会开始构建自己的报表模块或分析模块,…...
代码随想录刷题day51|(二叉树篇)654.最大二叉树
一、二叉树基础知识 详见:代码随想录刷题day34|(二叉树篇)二叉树的递归遍历-CSDN博客 二、递归思路 递归三部曲 构造树一般采用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树; 1.递归函数参数…...
深入理解 C++11 智能指针:独占、共享与弱引用的完美管理
文章目录 std::unique_ptr(独占式智能指针)std::shared_ptr(共享式智能指针)std::weak_ptr(弱引用智能指针)示例展示:智能指针的原理内存泄漏**什么是内存泄漏,内存泄漏的危害****如…...
1.2 编译器结构
编译器具有模块化的高层结构。还可以将模块化进一步细化。编译器可以看成多个阶段构成的流水线结构。 一种没有优化的编译器结构 更复杂的编译器结构...
文件操作助手
文件操作助手 在我们实现一个大型项目时,往往会有一个公共模块,这个公共模块是公用的,里面可能会包含文件操作助手、字符串操作助手、时间戳操作助手… 而我们今天就来实现一个文件操作助手,里面包含的功能有: 判断…...
线段树与扫描线 —— 详解算法思想及其C++实现
目录 一、线段树(Segment Tree) 基本概念 结构 操作 示例代码 二、扫描线(Sweep Line) 基本概念 应用场景 示例代码(矩形面积并集) 三、总结 一、线段树(Segment Tree) 基本…...
Leetcode 刷题笔记1 图论part04
leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…...
快速入手:Nacos融合SpringCloud成为注册配置中心
快速入手:Nacos融合SpringCloud成为注册配置中心 前言安装Nacos项目搭建添加配置启动类添加注解运行项目服务调用RestTemplate 模式FeignClient 模式 前言 Spring Cloud是一系列框架的集合,提供了微服务架构下的各种解决方案,如服务治理、配…...
others-rustdesk远程
title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...
go:前后端分离
1.前端代码 新建一个前端文件夹,在该文件夹下新建一个.html文件,写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下: func main() { // 服务运行提示 fmt.Println("go web server is runn…...
lodash 学习笔记/使用心得
lodash 学习笔记/使用心得 简单记一下 lodash 的一点学习笔记使用心得,最近也是打算清理一下所有的 dead code,然后发现我们用了好多的 lodash 方法。对比了之前的写法,重新看了一下官方文档,再自己重新动手写了点 util 之后发现…...
网络爬虫【爬虫库request】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…...
AI日报 - 2025年3月24日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优,推理速度提升高达12万倍 ▎💼 商业动向 | OpenAI用户破4亿,Meta与Reliance探讨AI合作 生态扩展与全…...
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
一、前言 在移动互联网蓬勃发展的今天,视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议,开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV(Flash Video)格式,尽管随着H…...
动态规划——混合背包问题
动态规划——混合背包问题 混合背包问题01背包与完全背包的混合:完全背包与多重背包的混合:三种背包混合混合背包OJ汇总 混合背包问题 将01背包、完全背包、多重背包混合起来的背包问题。也就是说,有的物品只可以取一次(01背包&a…...
数据库操作练习
一.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束,设置自增 alter table heros modify column id int auto_increment primary key;//name列…...
3.milvus索引-HNSW
索引作用 加速大型数据集上的查询。 向量字段,仅只能创建一个索引。 milvus支持的向量索引类型大部分使用 近似最近邻搜索算法。ANNS该算法的核心不局限于返回最准确的结果,而是仅搜索目标的邻居。ANNS通过在可接受的范围内牺牲准确性提高检索效率。 …...
算法基础——栈
一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶,另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素,出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…...
开发语言漫谈-groovy
groovy是一门脚本语言,在前期的脚本语言中简单介绍了下。现在再深入介绍下,因为它是本平台上选用的脚本语言。所谓脚本语言就是不用编译,直接执行。这种特色非常适合做嵌入编程,即编即用。我们知道平台后台的业务开发语言是Java&a…...
ArkUI-List组件
列表是一个复杂的容器,当列表项达到一定数量,使得列表内容超出其范围的时候,就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用,条件渲染,循环渲染,懒加载等渲染控制方式生成子组件…...
数据仓库的 DWD 分层架构:构建高效数据平台的基石
在数据驱动的时代,数据仓库(Data Warehouse)作为企业数据分析的核心基础设施,扮演着至关重要的角色。而数据仓库的分层设计,则是确保数据高效流转、提升数据质量、支持复杂分析的关键。本文将深入探讨数据仓库的 DWD 分…...
山东大学数据结构课程设计
题目:全国交通咨询模拟系统 问题描述 处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能地短,出门旅游的旅客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编织一个全国城市间的交…...
动态规划-01背包
兜兜转转了半天,发现还是Carl写的好。 看过动态规划-基础的读者,大概都清楚。 动态规划是将大问题,分解成子问题。并将子问题的解储存下来,避免重复计算。 而背包问题,就是动态规划延申出来的一个大类。 而01背包&…...
【2025】基于node.js的中医药科普平台的设计与实现(源码、万字文档、图文修改、调试答疑)
项目完整功能以演示视频为准 基于Node.js的中医药科普平台的设计与实现功能结构图如下 课题背景 随着人们健康意识的提高,中医药作为传统医学的重要组成部分,越来越受到关注。然而,中医药知识专业性强,普通大众获取准确、全面的中…...
基于Flux模型的多模态可控图像生成工作流实践
一、技术框架与模型选型 当前图像生成领域对多模态控制与一致性保持的需求日益增强,本文将基于Black Forest Labs推出的Flux.1模型,结合ControlNet的循环一致性优化技术,构建一套融合Canny边缘检测与深度图(Depth)控制…...
缓存过期时间之逻辑过期
1. 物理不过期(Physical Non-Expiration) 定义:在Redis中不设置EXPIRE时间,缓存键永久存在(除非主动删除或内存淘汰)。目的:彻底规避因缓存自动过期导致的击穿(单热点失效ÿ…...
JVM类加载过程详解
文章目录 前言1.加载2.链接验证文件格式验证元数据验证字节码验证符号引用验证 准备解析 3.初始化4.类卸载 前言 类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生命周期可以简单概括为 7 个阶段:加载(Loading)、验证&a…...
第三十二篇 深入解析Kimball维度建模:构建企业级数据仓库的完整框架
目录 一、维度建模设计原则深度剖析1.1 业务过程驱动设计1.2 星型模式VS雪花模式 二、维度建模五步法实战(附完整案例)2.1 业务需求映射2.2 模型详细设计2.3 缓慢变化维处理 三、高级建模技术解析3.1 渐变维度桥接表3.2 快照事实表设计 四、性能优化体系…...
WPF 布局中的共性尺寸组(Shared Size Group)
1. 什么是共性尺寸组? 在 WPF 的 Grid 布局中,SharedSizeGroup 允许多个 Grid 共享同一列或行的尺寸,即使它们属于不同的 Grid 也能保持大小一致。这样可以保证界面元素的对齐性,提高布局的一致性。 SharedSizeGroup 主要用于需…...
19 数码管的动态显示
1、八段数码管 八段数码管 是一个 “ 8 ” 字型数码管,分为八段,a b c d e f g dp,其中dp为小数点。每一段为一个发光二极管,这样的 8 段称为 段选信号 。 2、实验 1、实验目标:让六位数码管 从 0 开始记数࿰…...
pytorch 笔记:张量索引的维度扩展规则
1 基本原理 在PyTorch中,张量索引的维度扩展规则遵循以下原则: 索引操作的核心规则: 当使用索引数组访问张量时: 索引数组的每个元素对应选取原张量的一个子张量结果形状 索引数组形状 原张量剩余维度形状 这么说可能不清…...
课外活动:怎么理解可变成本?
可变成本深度解析 🧮 一、可变成本的本质 #mermaid-svg-qoqQaFxQBuZZfAD2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qoqQaFxQBuZZfAD2 .error-icon{fill:#552222;}#mermaid-svg-qoqQaFxQBuZZfAD2 …...
深入理解 JVM 的垃圾收集器:CMS、G1、ZGC
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法
本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期:2025年3月22日 作者:任聪聪 现象描述: 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…...
智慧高速,安全护航:视频监控平台助力高速公路高效运营
随着我国高速公路里程的不断增长,交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求,而监控视频平台的出现,则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…...
括弧匹配检验(信息学奥赛一本通-1354)
【题目描述】 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ࿳…...
MacOS安装 nextcloud 的 Virtual File System
需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...
【秣厉科技】LabVIEW工具包——OpenCV 教程(11):人脸检测与识别
文章目录 前言级联分类器FaceDetectorYNFaceRecognizerSF1. 特征提取2. 人脸对比3. 人脸身份识别(最佳匹配法) 总结 前言 需要下载安装OpenCV工具包的朋友,请前往 此处 ;系统要求:Windows系统,LabVIEW>…...
C++-C++中的几种cast
文章目录 static_castPOD类型互转任意指针类型与void*互转基类继承类之间的互转具有目标类型转换函数的类/单参数的构造函数 dynamic_castreinterpret_cast static_cast 所谓static,意思是在编译期进行的转换,static_允许如下转换: POD类型…...
list的模拟实现和学习
1. list的介绍及使用 说白了就是带头循环双向循环链表 stl 的两大组件就是容器和算法 ,他们两个之间是通过迭代器进行联系的 这三种算法函数 迭代器的种类 性质(容器底层结构决定) 单项: forward_list /哈希(unord…...
程序代码篇---Pyqt的密码界面
文章目录 前言一、代码二、代码解释2.1用户数据库定义2.2窗口初始化2.3认证逻辑2.5角色处理2.6错误处理优化2.7功能扩展说明2.7.1用户类型区分管理员普通用户其他用户 2.7.2安全增强建议 三、运行效果四、运行命令五、界面改进建议5.1密码显示5.2用户头像显示5.3输入框动画效果…...
设计模式的六大原则
设计模式的六大原则 1. 单一职责原则 (Single Responsibility Principle, SRP) 一个类应该只负责一项职责。 示例代码 // 不好的设计:一个类承担多个职责 typedef struct {void (*read_data)(void);void (*process_data)(void);void (*save_data)(void);void (*…...
【Linux】信号:信号保存和处理
🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达:每个信号都有一个默认行为,例如终…...