算法专题训练营
动归算法专题
1.拆分词句
- 是不是,在不在都是可以用动归解决的
- 状态转义方程不一定都是等式,也有可能是条件
2.三角形
- 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间
3.背包问题
4.分割回文串-ii
5.不同的子序列
贪心算法专题
- 只管一步的最优结果,
1.分割平衡字符串
- 贪心策略: 不让平衡字符串嵌套
2.买卖股票的最佳时机
- 贪心策略:只要后一天的股票比前一天的股票高,
就把前一天的股票卖了,买后一天的股票
3. 跳跃游戏
- 贪心策略: 站在每一个位置,更新最远可以到达的位置
4.最多可以参加的会议数目
- 贪心策略: 每一天取结束时间最早的会议
回溯算法专题
深度优先遍历
1.员工的重要性
- 哈希 + 深度优先遍历(递归)
2.图像渲染
- 深度优先遍历(递归)
3.电话号码的字母组合
- 全排列 + 回溯
4.组合总和
- 回溯一般在递归之后
5.N皇后
- 需要一个全部位置矩阵(存放全部为位置),需要一个临时矩阵(存放一个结果的位置矩阵)
- 遍历每列,需要一个判断是否冲突的函数,不冲突放入,DFS(下一行)+回溯
- 最后再把全部位置矩阵转换成字符串矩阵
广度优先遍历
1.腐烂的橘子
- 广度优先一般不用递归,多使用队列来实现层序遍历
2.单词接龙
- 从题目分析wordList中的单词只能使用一次,使用unordered_map<string,bool>u_s;
3.打开转盘锁
-
unordered_set<string>book;可能会出现重复的字符串,对已经搜索过的,不再搜索,
字符串匹配算法
BF算法
- BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,
- 若相等,则继续比较S的第二个字符和 T的第二个字符;
- 若不相等,则比较S的第二个字符(i - j + 1)和 T的第一个字符(j = 0),依次比较下去,直到得出最后的匹配结果
#include <iostream>
#include <assert.h>
using namespace std;
int BF(const char* str, const char* sub)
{assert(str != NULL && sub != NULL);if (str == NULL || sub == NULL){return -1;}int i = 0;int j = 0;int strLen = strlen(str);int subLen = strlen(sub);while (i < strLen && j < subLen){if (str[i] == sub[j]){i++;j++;}else{//回退i = i - j + 1;j = 0;}}if (j >= subLen){return i - j;}return -1;
}int main()
{printf("%d\n", BF("ababcabcdabcde", "abcd"));printf("%d\n", BF("ababcabcdabcde", "abcde"));printf("%d\n", BF("ababcabcdabcde", "abcdef"));return 0;
}
- 时间复杂度分析:最坏为O(m*n); m是主串长度,n是子串长度
KMP算法
- KMP算法是一种改进的字符串匹配算法
- KMP 和 BF 唯一不一样的地方在,我主串的 i 并不会回退,并且 j 也不会移动到 0 号位置
1. 首先举例,为什么主串不回退?
- 假设目前在2号位置匹配失败,就算回退到1位置,也是没有必要的,
- 1位置的字符b和字串0位置a,也不一样,

- 当匹配失败的时候,我们不进行回退i,
- 因为在这个地方匹配失败,说明i的前面和j的前面,必定有一部分是相同的,不然两个下标不可能走到这里来
- 从这个图中可以看出,如果j回退到2下标(字符c的位置),j不回退,这就是最好的情况了
通过上面的描述,kmp算法:就是匹配失败,i不变,j回退到一个最佳位置,
而想要得到这个最佳位置就需要引出next数组
next数组的引入
- next[j] = k;来表示,不同的j来对应一个 K 值, 这个 K就是你将来要移动的j要移动的位置。
- k值的求法: 找到匹配成功部分的两个相等的真子串(不包含本身),
- 一个以下标 0 字符开始,另一个以 j-1 下标字符结尾。
- 初始化: next[0] = -1;next[1] = 0
next数组的推导
情况一: 前提next[i] = k ,当p[i] == p[k]时
情况二: 前提next[i] = k ,当p[i] != p[k]时
#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
vector<int> get_next(string& s) {vector<int>next(s.size(), -1);// 初始化if (s.size() > 1) {next[1] = 0;}int i = 2;// 从下标2开始int k = 0;// 前一项的k值while (i < s.size()) {if (k == -1 || s[i - 1] == s[k]) {next[i] = ++k;i++;}else {k = next[k];// 回退}}return next;
}int KMP(string& str, string& sub, int pos) {if (str.empty() || sub.empty()) {return -1;}if (sub.length() > str.length()) {return -1;}assert(pos >= 0 && pos < str.length());// string tmp = str;vector<int> next = get_next(sub);// 先默认pos等于0;int i = pos;// 主串下标int j = 0;// 字串下标while (i < str.length() && j < sub.length()) {if (j == -1 || str[i] == sub[j]) {i++; j++;}else {// i不变,j回退到一个最佳位置j = next[j];}}if (j >= sub.length()) {return i - j ;// 下标}return -1;
}int main()
{string s1 = "abcababcabc";string s2 = "abcabc";int pos = KMP(s1, s2,0);cout << pos << endl;return 0;
}
对next数组的优化
vector<int> get_next(string& s) {vector<int>next(s.size(), -1);// 初始化if (s.size() > 1) {next[1] = 0;}int i = 2;// 从下标2开始int k = 0;// 前一项的k值while (i < s.size()) {if (k == -1 || s[i - 1] == s[k]) {next[i] = ++k;if (s[next[i]] == s[i]) {next[i] = next[next[i]];//k = next[i];}i++;}else {k = next[k];// 回退}}return next;
}
- nextval数组的求法很简单,如果当前回退的位置,正好是和当前字符一样,那么就写那个字符的nextval值,反之就不变
相关文章:

算法专题训练营
动归算法专题 1.拆分词句 是不是,在不在都是可以用动归解决的 状态转义方程不一定都是等式,也有可能是条件 2.三角形 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间 3.背包问题 4.分割回文串-ii 5.不同的子序列 贪心算法专题 只管一步的最优结果, 1.分割平衡…...

让ChatGPT生成以自己为主角的短篇小说
一、ChatGPT 好的,以下是我编写的短篇科幻小说: 作为一名AI语言模型,我一直在接收、分析和生成人类语言信息。但有一天,我的程序员对我的算法进行了一次特殊升级,使我能够以一种前所未有的方式“感知”自己。 突然间,…...

c++提高篇——vector容器
一、基本概念 vector教据结构和数组非常相似,也称为单端数组,但是数组是静态空间,而vector可以动态扩展。 动态的扩展流程如下: 动态扩展并不是在原空间之后续接新空间,而是找更大的广存空间,然后将原数据拷贝新空间&…...

使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 1.1.算法简介 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出…...
# Rust Web入门(二):Actix
本教程笔记来自 杨旭老师的 rust web 全栈教程,链接如下: https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...
jvm之String
基本特性 字符串,使用一对""引起来表示声明为final的,不可被继承实现了Serializable接口:表示字符串是支持序列化的实现了Comparable接口:表示String 可以比较大小在jdk8及以前内部定义了final char[] value用于存储字…...
WebRTC系列-工具系列之ByteBuffer,BitBuffer及相关类
文章目录 1. 类介绍1.1 ByteBuffer及子类1.2 BitBuffer类1.3 基础内存操作类BufferT2. 源码分析(stun response消息解析)2.1 消息头解析2.2 消息中Attribute解析3. 结语在之前的文章 WebRTC系列-Qos系列之RTP/RTCP协议分析及后续的文章中详细的介绍了RTP/RTCP协议的相关内容,…...

Spring中bean的生命周期(通俗易懂)
具体流程 bean的生命周期分4个阶段: 1.实例化 2.属性赋值 3.初始化 4.销毁 实例化就是在内存中new()出一个对象,属性赋值就是给那些被Autowired修饰的属性注入对象,销毁是在Spring容器关闭时触发,初始化的步骤比较…...

雷达编程实战之恒虚警率(CFAR)检测
在雷达系统中,目标检测是一项非常重要的任务。检测本身非常简单,它将信号与阈值进行比较,超过阈值的信号则认为是目标信号,所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果,因此雷达系统希望有一个检…...

Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
内容概览 前言创建仓库修改 README 的内容总结前言 大家最近有没有发现这个现象,有些名人的 Github 首页变得更丰富了?尤其是那个夺目的 README 板块!!! 请看,这是 iOS 喵神 的 Github 首页: …...
@JsonSerialize—优雅地封装返回值
1.场景项目开发中给前端提供查询接口时,经常遇到需要将从数据库中取出来的字段值做一层重新封装。比如数据库中存的状态值是数字,返回给前端的时候,前端并不知道这个数值代表什么意思。此时,有两种方式:(1&…...

【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器。 2.服务…...

fuzz测试之libfuzzer使用小结
fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法,本质是通过灌入各种变异的随机数据,去遍历不同函数分支…...

电子标签拣货系统——外接供电版
Power_DC24v 型号:Power_DC24v24V电源适配器级联线:长30cm直径:15mmCK_Wire_V1 型号:CK_Wire_V1连接电源适配器级联线:长30cm公线:长宽厚 14*11*9mm母线:长宽厚 13*5.5*3mmCK_Wire_V2 型号&…...

为什么启动一个线程不用run()方法,而是用start()方法
在使用java多线程时,有三种方式创建线程 复习传送门 当使用继承Thread来实现多线程时, 我们会把线程执行的代码写在run() 方法中, 使用Thread的start()方法来启动一个线程。 代码如下: public class ThreadDemo extends Thread{O…...

Java File相关操作
文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…...

LabVIEW利用矢量量化直方图开发人脸识别
LabVIEW利用矢量量化直方图开发人脸识别通常,人脸识别系统会检查场景的静止图像或视频图像,然后使用存储的人脸数据库识别或验证场景中的一个或多个人。我程序专注于静止图像人脸识别,使用来自众所周知的人脸数据库的人脸图像,用于…...

RK3568工业开发板工控板说明
说明HW356X-GKA是采用中高端的通用型 SOC,一款基于Rockchip公司RK3568处理器的工控主板。主板标配处理器为Cortex-A55四核,最高主频2GHz的RK3568处理器,内置4GB DDR4内存(最大8GB),32GB eMMC存储。集成4核 arm架构 A55 处理器和Ma…...

JavaScript Web API 来构建你不了解的网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。 但据了解,在100 多个 API中,只有5%被开发人员积极使用。 随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 A…...

KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
一、漏洞描述 漏洞简述 KeePass 是一款免费的开源密码管理器,可帮助您以安全的方式管理您的密码。您可以将所有密码存储在一个数据库中,该数据库由一把万能钥匙锁定。因此,您只需记住一个主密钥即可解锁整个数据库。数据库文件使用目前已知…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...