算法专题训练营

news/2024/5/3 11:01:33/文章来源:https://blog.csdn.net/LYC_462857656/article/details/128442796

动归算法专题

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,也不一样,
2.j的回退位置
  •  当匹配失败的时候,我们不进行回退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值,反之就不变

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71534.aspx

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

相关文章

高并发系统设计之负载均衡

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录DNS负载均衡Nginx负载均衡负载均衡算法负载均衡配置超时配置被动健康检查与主动健康检查LVS/F5Nginx当我们的应用单实例不能支撑用户请求时&#xff0c;此时就需要扩容&#xff0c;从一台服务器扩容到…

Navicat Premium 安装 注册

Navicat Premium 一.Navicat Premium的安装 1.暂时关闭windows的病毒与威胁防护弄完再开&#xff0c;之后安装打开过程中弹窗所有警告全部允许,不然会被拦住 2.下载安装包&#xff0c;解压 链接&#xff1a;https://pan.baidu.com/s/1X24VPC4xq586YdsnasE5JA?pwdu4vi 提取码…

论文阅读 | Real-Time Intermediate Flow Estimation for Video Frame Interpolation

前言&#xff1a;ECCV2022 快速插帧方法 Real-Time Intermediate Flow Estimation for Video Frame Interpolation 引言 进行视频插帧目前比较常见的方法是基于光流法&#xff0c;分为两个步骤&#xff1a;1.通过光流对齐输入帧&#xff0c;融合对齐的帧 光流并不能直接同于…

epoll 笔记

maxevents 参数大小一般不超过64必须够了 maxevents 个事件&#xff0c;才会传到用户空间吗&#xff1f;可见&#xff0c;只要有事件就可以传到用户空间。一台服务器可以支撑多少个链接https://blog.csdn.net/mijichui2153/article/details/81331345 0、两台虚拟机的初始状态如…

亮个相吧小宝贝儿,五款压箱底的软件

今天要给大家推荐5款压箱底的宝贝软件了&#xff0c;百度搜索一下就能找到下载链接了。 1.开源浏览器——Firefox Firefox是一个自由的&#xff0c;开放源码的浏览器&#xff0c;适用于 Windows, Linux 和 MacOS X平台&#xff0c;Mozilla Firefox官方版体积小速度快&#xf…

rocketmq延时消息自定义配置

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分&#xff1a; nameserver&#xff1a;保存路由信息broker&#xff1a;保存消息生产者&#xff1a;生产消息消费者&#xff1a;消费消息 延时消息的处理是在其中的broker中。 但是…

堆球问题,开普勒猜想(格密码相关)

目录 一. 介绍 二. 历史进展分析 三.2维下的堆球问题 四. 3维下的堆球问题 五. 8维与24维下的堆球问题 总结 一. 介绍 堆球问题又叫堆球理论、最密堆积、球填充&#xff0c;英文为The Theory Of Sphere Packings。 堆球问题的本质就是填充一堆大小相同的球。要求这些球…

公会发展计划(GAP)第三季

继前两季发布的公会发展计划取得成功之后&#xff0c;Yield Guild Games 现在推出了第三季的公会发展计划&#xff08;GAP&#xff09;。GAP 在第二季有了显著的增长&#xff0c;有超过 3000 个成就 NFT 被铸造。GAP 是以成就为导向的社区代币分配协议&#xff0c;下一次迭代将…

pmp考试是什么?适合哪些人学?含金量?(含pmp资料)

先说一下我这个人的理解&#xff0c;PMP就是提高项目管理理论基础和实践能力的考试。 再说说PMP官方一点的说明&#xff1a; PMP证书全称为Project Management Professional&#xff0c;也叫项目管理专业人士资格认证。PMP证书由美国项目管理协会(PMI)发起&#xff0c;是严格…

美国原装二手keysight E4980A(安捷伦)2MHZ LCR表

Agilent E4980A、Keysight E4980A、LCR 表&#xff0c;20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备&#xff0c;用于测量电子元件的电感&#xff08;L&#xff09;、电容&#xff08;C&#xff09;和电阻&#xff08;R&#xff09;。LCR 表可…

关于在VM上的windows server 2022系统安装

目录 1、windows serer 2022安装的准备工作 1&#xff09;下载系统 2&#xff09;寻找对应系统密钥 3&#xff09;配置server系统开机配置项&#xff08;可能会出现sconfig配置界面&#xff09; 2、开始安装server系统 1、windows serer 2022安装的准备工作 1&#xff09;…

【离散数学】1. 数理逻辑

1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 离散数学&#xff1a;研究离散量结构及相互关系的学科 数理逻辑集合论代数系统图论 逻辑&#xff1a;研究推理的科学 数学方法&#xff1a;引进一套符号系统的方法 数理逻辑是用数学方法研究形式逻辑的科学&#xff0c;即使用符号化…

「可信计算」与软件行为学

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

实验室设计|实验室设计要点SICOLAB

一、实验室设计规划要素1、实验室布局&#xff1a;实验室的布局要符合实验室工作流程&#xff0c;可以将实验室划分为干净区和污染区&#xff0c;以确保实验室的卫生和实验的准确性。2、设备选购&#xff1a;根据实验需要选择适当的设备&#xff0c;并确保设备的质量和性能符合…

Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记

文章目录1.启动流程1.1 最先进入的文件&#xff1a;head_s.S1.2 start_kernel()函数所在的文件&#xff1a;init.c1.3 input_init()函数所在文件&#xff1a;sys_input.c1.4 INPUT_LKeyDevInit()所在文件&#xff1a;keyboarddev.c1.5 esINPUT_RegLdev()所在文件&#xff1a;in…

【LeetCode】剑指 Offer 09. 用两个栈实现队列 p68 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/ 1. 题目介绍&#xff08;09. 用两个栈实现队列&#xff09; 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别…

如何运行YOLOv6的代码实现目标识别?

YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0&#xff0c;也是可以正常运行的pip install -r requirement…

【机器学习】决策树-C4.5算法

1.C4.5算法 C4.5算法与ID3相似&#xff0c;在ID3的基础上进行了改进&#xff0c;采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益&#xff0c;ID3使用的是熵&#xff08;entropy&#xff0c; 熵是一种不纯度度量准则&#xff09;&#xff0c;也就是熵的变化值&…

Kaldi语音识别技术(六) ----- DTW和HMM-GMM

Kaldi语音识别技术(六) ----- DTW和HMM-GMM 文章目录Kaldi语音识别技术(六) ----- DTW和HMM-GMM前言一、语音识别概况二、语音识别基本原理三、DTW&#xff08;动态时间弯折&#xff09;算法四、GMM-HMM前言 前面的内容中我们完成了特征的提取,那么本章节我们主要进行理论部分…

2023爱分析· 云管理服务(MSP)市场厂商评估报告:华创方舟

目录 1. 研究范围定义 2. 云管理服务&#xff08;MSP&#xff09;市场定义 3. 厂商评估&#xff1a;华创方舟 4. 入选证书 1. 研究范围定义 数字化时代&#xff0c;应用成为企业开展各项业务的落脚点。随着业务的快速发展&#xff0c;应用的功能迭代变得越来越…