哈希表的使用刷题

目录

前言

题目简述

解题思路

①哈希表的建立

②双指针

具体的实现过程

完整代码

AC凭证

水话


前言

今天已经是2021年的最后一天了,所以本篇肯定会有点偷懒了,但是还是希望能够发一篇博客呢,在这里提前祝大家新年快乐鸭!然后2021年从第一天到现在,不知道大家的新年愿望都完成过了吗?我觉得我还有很多的心愿没能完成或者说,没有能力去完成。希望2022年的时候自己能够变得更强一点,强大到无往不利吧!也希望自己离自己的动力源泉更进一步!还有,在新年告别之际,我们的冰冰还发了总结视频哦,这里是链接:王冰冰新年总结

题目简述

解题思路

①哈希表的建立

这题熟悉哈希表的同学,一定会设立哈希表来进行解题,这里面的哈希表可以进行字符串的存储,然后我们存储下两个变量,一个就是是否需要本字符串的哈希表,另外一个就是此字符串在第二个文章里面出现的次数,便于后面的遍历。

②双指针

其实说是双指针,但是其实在后续遍历文章的时候,利用到的是尺取的思想,也就是利用一把无形的尺子,然后选取我们需要的区间长度。有关尺取的介绍,可以看看这位大佬的介绍,因为每一个题目的不同,此思想在使用上就会有相应的变化,所以大家根据实际来进行思想的实践噢;

具体的实现过程

例如这里,如果我们把字符串看成数字,这个时候我们要找到包含1,2,3(不需要分先后顺序)的最短长度的连续串,让两个指针从开始往后。先让p2往后动,发现可以加入,字串长度加1,然后再往后,发现p2重复了,这个时候因为我们没有找到3,所以让p2继续动,找到了3,长度更新为4了,然后再让p2到1,发现p2的值已经和p1相等了,所以这个时候可以大胆的移动p1到2,然后发现又有一个重复的2,所以又可以大胆的移动p1到下一个2,这样的话最终的结果3就是最优的解。如果大家看不懂的话,看一下完整的代码,然后对着我的图走一遍,应该就会知道其中的奥妙了!

完整代码

#include<bits/stdc++.h>
using namespace std;
//记录一个字符串出现的次数 
map<string,int>times;
//记录是否需要一个字符串
map<string,bool>flag;
int n,m;
//进行输入字符串 
string s1,s[100005];
//两个答案的记录,以及双指针的建立
int ans1,ans2,p1,p2; 

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s1;
		flag[s1]=1;  //表示此单词是需要背的 
	}
	cin>>m;
	p2=1;
	for(int i=1;i<=m;i++)
	{
		p1=i;
		cin>>s[p1];
		if(flag[s[p1]]) times[s[p1]]++;
		if(times[s[p1]]==1) {ans1++;ans2=p1-p2+1;}
		while(p2<=p1)
		{
			if(!flag[s[p2]]) {p2++;continue;} //不是我们需要的 
			if(times[s[p2]]>=2) {times[s[p2]]--;p2++;continue;}  //遇到重复的项了 
			break;
		}
		ans2=min(ans2,p1-p2+1);
	}
	cout<<ans1<<endl<<ans2<<endl;
}

AC凭证

水话

因为是新年的最后一天了嘛。我想在这里感谢2021年来爱我的家人们,同学们以及我爱的他们。在2021年里,有遇到过很多的彷徨,迷茫。然后自己会发现很多情况下,无论多么的努力,结果总会是有一些不尽如人意的地方,但是在很多绝望的时候,永远有一些人在引领着我向前。首先是我的女神,来自清华的一位超级漂亮的学姐,虽然我们没见过几次面,甚至她可能都不知道我长什么样吧,但是在自己学习学不下去的时候,看到她的努力,看到她的成就,总会给自己一种激励的感觉,然后她的笑容真的非常非常的治愈,虽然现在和她之间的差距非常大,但是我还是会努力地向她看齐,争取能够和她一样,成为一个优秀的自己。然后就是想要感谢冰冰,虽然当初粉上王冰冰真的就是因为颜值吧,但是到后面看了很多很多她相关的视频,我发现她也是一个普通人,通过自己很硬的专业能力以及通过自己的努力,最终取得一个又一个的成就,希望自己能够继续粉上优秀的人。最后就是我一直很喜欢的林俊杰了,他的音乐给我很大的鼓舞作用和治愈能力,然后最近听到他的《有梦不难》,我相信自己的梦想终将有一天可以实现!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheep.ice

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值