算法专题训练营

news2024/9/22 1:29:35

动归算法专题

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.coloradmin.cn/o/359480.html

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

相关文章

前缀和差分(C/C++)

目录 1. 前缀和的定义 2. 一维前缀和 2.1 计算公式 2.2 用途 2.3 小试牛刀 3. 二维前缀和 3.1 用途 1. 前缀和的定义 对于一个给定的数列A&#xff0c;他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。 如下图&#xff1a;绿色区域的和就是前缀和数组…

如何在SpringBoot项目上让接口返回数据脱敏,一个注解即可

1 背景需求是某些接口返回的信息&#xff0c;涉及到敏感数据的必须进行脱敏操作2 思路①要做成可配置多策略的脱敏操作&#xff0c;要不然一个个接口进行脱敏操作&#xff0c;重复的工作量太多&#xff0c;很显然违背了“多写一行算我输”的程序员规范。思来想去&#xff0c;定…

关于数字化营销技术实现之【数据埋点】

1.如何实现数据埋点&#xff1f;小程序数据埋点是指在小程序中收集用户行为数据和业务数据的一种技术手段&#xff0c;以便对用户行为和业务运营进行分析和优化。下面是一些实现小程序数据埋点的方法&#xff1a;使用小程序统计分析工具&#xff1a;小程序平台提供了统计分析工…

约束优化:低维线性时间线性规划算法(Seidel算法)、低维线性时间严格凸二次规划算法

文章目录约束优化&#xff1a;低维线性时间线性规划算法&#xff08;Seidel算法&#xff09;、低维线性时间严格凸二次规划算法带约束优化问题的定义带约束优化问题的分类及时间复杂度低维线性规划问题定义Seidel线性规划算法低维严格凸二次规划问题定义低维情况下的精确最小范…

【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;分别…

【大厂高频必刷真题100题】《是子序列吗?》 真题练习第28题 持续更新~

是子序列吗? 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 进阶: 如果有…

火山引擎 DataTester:在广告投放场景下的 A/B 实验实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “我知道在广告上的投资有一半是无用的&#xff0c;但问题是我不知道是哪一半。” ——零售大亨约翰沃纳梅克 这句经典名言&#xff0c;被称为广告界的哥特巴赫猜想…

Python脚本批量下载CDS气象数据

使用Python脚本从 Copernicus Climate Data Store (CDS) 检索气象数据具体地&#xff0c;需要检索变量&#xff08;geopotential、relative_humidity、temperature、u_component_of_wind、v_component_of_wind、vertical_velocity&#xff09;在各种不同的压力水平、不同的日期…

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法 情况说明: 在打开Studio 5000软件时,出现一个弹窗Log On to FactoryTalk - Network,正常情况下输入Windows账户和密码就可以登录成功。 但是却出现了下图所示窗口,其中‘abseme’是Windows账户名,‘WELL’是计算机名称,下图…

SQL零基础入门学习(二)

SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name;与 SELECT * FROM table_name;参数说明&#xff1a; column1, column2, …&#xff1a;要选择的…

向上跳空缺口选股公式,选出回补后再启动的标的

一、向上跳空缺口选股公式 思路&#xff1a;先找出缺口&#xff0c;缺口前后有两根K线&#xff0c;缺口低价是前一根K线的最高价&#xff0c;缺口高价是后一根K线的最低价。&#xff08;如上图&#xff09;收盘价低于缺口低价&#xff0c;即实现缺口回补。回补缺口之后&#xf…

“一把梭ViT”来了,谷歌提出可以灵活应对各种图像块尺寸的FlexiViT

原文链接&#xff1a;https://www.techbeat.net/article-info?id4486 作者&#xff1a;seven_ 论文链接&#xff1a; https://arxiv.org/abs/2212.08013 代码链接&#xff1a; https://github.com/google-research/big_vision 视觉Transformer&#xff08;ViT&#xff09;目前…

Linux - 第4节 - Linux进程控制

1.进程创建 1.1.fork函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。#include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&…

考虑泄流效应的光伏并网点电压系统侧增援调控方法matlab

目录 1主要内容 1.1 泄流效应​编辑 1.2 候选无功补偿站优选方法 1.3 算法步骤 2部分代码 3程序结果 4程序链接 1主要内容 程序主要复现《考虑泄流效应的风电场并网点电压系统侧增援调控方法_于其宜》&#xff0c;将光伏取代风电&#xff0c;考虑某时刻光伏并网的电压增…

3年工作之后是不是还在“点点点”,3年感悟和你分享....

经常都有人问我软件测试前景怎么样&#xff0c;每年也都帮助很多朋友做职业分析和学习规划&#xff0c;也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候&#xff0c;明显的会发现功能测试很…

死磕JAVA10余年!手写“Java核心技能精选”Github一夜疯涨30w+

写在前面 想在面试、工作中脱颖而出&#xff1f;想在最短的时间内快速掌握 Java 的核心基础知识点&#xff1f;想要成为一位优秀的 Java 工程师&#xff1f;本篇文章能助你一臂之力&#xff01; 很多同学对一些新技术名词都能侃侃而谈&#xff0c;但对一些核心原理理解的不够…

很好用的 UI 调试技巧

文章目录 UI调试效果(一)评论最后UI调试小姑(二)参考文档 很好用的 UI 调试技巧 UI调试效果(一) javascript: (function() {const style = document<

RT-Thread初识学习-02

课程链接 02-RT-Thread介绍_哔哩哔哩_bilibili 学习方法 使用官方资料进行学习&#xff0c;并且在学习的过程中与FreeRTOS进行比较 RT-Thread API参考手册: 基础定义 标准版RTT移植 这里的串口2是由于打印信息的&#xff0c;因此你需要在开发板上选择USB-TTL串口&#xff0…

什么是品牌控价?品牌控价的意义是什么?品牌控价合不合法

很多人不明白为什么要控价&#xff0c;今天我们就来聊一聊品牌控价。 一、 什么是控价 顾名思义&#xff0c;“控价”就是管控价格&#xff0c;将价格控制在合理的范围以内。 品牌方生产出产品&#xff0c;要以一定的价格投入市场。而市场中的实际成交价格会受渠道各因素的影…

Kubernetes二 Kubernetes之实战以及pod详解

Kubernetes入门 一 Kubernetes实战 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 1.1 Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。…