首页 > 编程语言 >【期末复习?】有关滑动窗口算法与哈希表的笔记

【期末复习?】有关滑动窗口算法与哈希表的笔记

时间:2024-12-22 10:03:25浏览次数:6  
标签:right 窗口 复习 int len 哈希 滑动 left

文章目录


前言

即将期末考试,感觉自己水平明显下滑(虽然本来就没什么水平),先看点东西提升一下。

同时预告一下:据读者反映,原博客“2024XDOJ及答案”打开会卡住。个人推测是文字量太大(毕竟已经将近十万字了,笑哭),加载困难的原因,因此这里提前说明。

原博客“2024XDOJ及答案”将停止更新

同时,我会将所有题目按类别集合发布,以便查看和复习。

事先说明:本文根据网上资料搜集并自行总结而成,如有侵权,告知立删。


题目:无重复字符的最长子串
问题描述
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
输入格式
待处理的字符串s
输出格式
最长子串 的长度

这是XDOJ的P542,一道四星难题。但如果使用滑动窗口算法和哈希表算法,会比较简单。笔者将以此题为例,讲解这两种算法。

滑动窗口和哈希表是两种常见的算法技术,经常用于解决一些具有序列或子串要求的问题。它们通常结合使用,能够高效地解决问题,特别是在字符串、数组等数据结构上。

一、滑动窗口

何为滑动窗口?

移动窗口是一种通过滑动区间或子串的边界来动态调整计算范围的算法技巧。它通常用于处理涉及连续子序列的问题,尤其是当我们需要优化时间复杂度时,尤其是在处理线性时间复杂度(O(n))的问题时。

用人话来说,就是通过调整左边界、右边界,对整个数组进行分段处理。

因此,这种算法非常适合用在对子数组的处理上。

基本操作:

1.设定窗口:定义左右指针——初始化left = right = 0,将[left, right]视为窗口。
2.开始滑动:
a.扩展窗口: 不断right++,使窗口向右扩展,直到不再符合某种条件。(找到问题的一个可行解)
b.收缩窗口:移动左边界来缩小窗口,直到重新符合条件。(寻找其他的解以获得最优解)
c.不断循环a,b,直到right触碰到边界。
按照题干要求,在right或left移动时,结果要跟着实时更新。

接下来是实践时间:
我们可以按照模板写出以下伪代码:

#include <stdio.h>
int main(){
	char s[50001] = {'\0'};
	scanf("%s", s);
	int left = 0;//定义左指针 
	int maxlen = 0, len = 0;
	for (int right = 0; s[right] != '\0';right++){
		if(出现重复字符 ){
			left移动到某位置 //使窗口内无重复字符。
		}
		len = right - left + 1;//结果len随着right实时更新
		if (len > maxlen) maxlen = len; 
	}
	printf("%d", maxlen);
	return 0;
}

那么,如何判断字符是否重复呢?
下面,我们介绍哈希表。

二、哈希表

何为哈希表?

哈希表是一种数据结构,它通过哈希函数将键映射到哈希表的一个索引位置。哈希表支持常数时间复杂度的查找、插入和删除操作。具体来说,哈希表的主要操作是通过一个哈希函数将一个键值映射到一个数组索引,然后在该索引位置存储该值。

换言之,便是用一个值来代表我们需要的内容。

哈希表特别适合用于查找某个元素是否存在,或者统计某些元素的频率等问题。
在字符串问题中,哈希表常用来快速查找和更新元素的位置、频率或是否出现过。

在本题中,滑动窗口所要满足的条件即当前窗口中无重复字符。
而哈希表可以帮助我们:
如果当前字符已经存在于哈希表中,则说明该字符在当前窗口内已经出现过,需要收缩窗口。
如果当前字符没有出现过,则将其加入哈希表,并继续扩展窗口。

二者是如此的和谐,以至于二者近乎同时使用。

让我们完成前面的伪代码吧:

#include <stdio.h>
int main(){
	char s[50001] = {'\0'};
	scanf("%s", s); 
	int finalset[256];//ASCII码共256位,每个元素代表一个字符 
	//这里我们利用该哈希表,记录每个字符出现的最后位置
	for (int i = 0;i < 256;i++){
		finalset[i] = -1;//尚未读取到字符 
	}
	int left = 0;//定义左指针 
	int maxlen = 0, len = 0;
	for (int right = 0; s[right] != '\0';right++){
		char current_word = s[right];
		if (finalset[current_word] >= left){
			left = finalset[current_word] + 1;//移动left 
		}
		finalset[current_word] = right;//更新该字符的最后一个位置 
		len = right - left + 1;//结果len随着right实时更新
		if (len > maxlen) maxlen = len; 
	}
	printf("%d", maxlen);
	return 0;
}

这样,我们就用一种精炼简洁的方式,完成了这道所谓的四星题。

标签:right,窗口,复习,int,len,哈希,滑动,left
From: https://blog.csdn.net/MikywayGalaxy/article/details/144636795

相关文章

  • 代码随想录算法训练营第五天-哈希-242.有效的字母异位词
    这道题的总体感觉不是很难,但是其完成的思想还是很有趣的利用数据下标来代表字母序列然后遍历两个字符串每个字符,给对应字母下标的数组中一个自增,另一个自减通过查看最后的数组内容是不是0,来判断是不是异位词#include<iostream>#include<array>classSolution{public......
  • BBU-Python期末考试复习题目总结
    临近期末,抽个时间把BBU-python期末考试会考的题型(原题?)哈哈总结一下,python考试是比较简单的,题型分为选择题,判断题,填空题,程序阅读题,编程题,我在最后还加了一点重要的书上知识点,放到我的个人bolg上供大家参考,祝考试高分通过————一.选择题选择题大概率为三次学习通作业上的......
  • 数据结构-哈希表的代码实现
    哈希表:将要存储数据的关键字和存储位置之间建立起对应的关系,这个关系即为哈希函数。存储数据时,通过哈希函数映射存储位置,数据查找时,通过哈希函数寻找存储位置。目的是为了提高数据的查找效率。main.c:hash.c:hash.h:......
  • 基础 (map,pair的使用详解)/题目 两数之和 讲解 哈希表的使用
    力扣题目链接(opensnewwindow)https://leetcode.cn/problems/two-sum/给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给......
  • Linux复习1——导论
    世界三大操作系统:Windows、UNIX、LinuxUNIX简洁、开放、可移植、价格高昂、闭源Linux继承UNIX的优点、免费、开源Linux的诞生:1991年,芬兰的一名大学生LinusTorvalds开发了linux内核#开源的优点:·低风险:开源社区维护开源代码,而开源社区几乎不可能倒闭·低成本:社区免费维护......
  • 【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
    文章目录前言一、C语言是什么?二、编译器的选择——VS2022三、main函数四、printf函数五、库函数六、关键字七、字符和ASCII编码八、字符串和'\0'九、转义字符十、注释总结前言上周考完四级(明年再战hh)和两门考试,接下来一个月将迎来其他学科的期末考试,所以这一个月......
  • 高级软件架构师复习笔记-第1章 计算机硬件
    22年考过磁盘调度,后续考的概率很小。一、计算机硬件组成1.组成硬件系统组成:5大部分。运算器、控制器、存储器、输入设备、输出设备。运算器+控制器=CPU。用于数据加工处理、计算、逻辑运算、控制。存储器:内存、外存。外设:输入设备、输出设备。2.CPU功能:程序控制、操作......
  • 复分析 个人笔记(期末复习向)
    ZJU数院2024-2025复分析补天笔记所有定理全文默写且会用!!!第一章复分析基本概念定义\(z=x+iy\)\(\mathrm{Re}z=x\):\(z\)的实部\(\mathrm{Im}z=y\):\(z\)的虚部\(\overline{z}=x-iy\):\(z\)的共轭\(|z|=\sqrt{x^2+y^2}\):\(z\)的模长\(D(z_0,r)\):以\(z\)为圆心......
  • 【计算机网络篇】计算机网络期末复习题库详解
         ......
  • 随机三模数哈希
    #include<bits/stdc++.h>#definef(i,m,n,x)for(inti=(m);i<=(n);i+=(x))typedeflonglongll;constintN=1e6+7;constllp=998244353ll,base=131ll;chars[N],t[N];llls,lt,loc[N],dp[N],g[N],ans[N],c[N];llpr......