一、前言
进入了hash部分好像感觉难了很多,我想这可能跟我们的学习和刷题的方向有关,在学校里更多的是对理论部分的讲解(尤其是考研计算机的uu,对站、队列理论有比较多的练习),但是对于set、map等STL容器其实了解的并不多也基本上不会碰到(我是指没有刷题,只关注考研内容的uu)。如果有想系统了解STL容器的我也在这里放上一些我觉得还不错的一些b站视频供uu们学习
同时也放上卡哥对于hash表基础知识的讲解链接(代码随想录)。
http://【C++进阶STL容器语法(栈、队列、堆、map、set)】https://www.bilibili.com/video/BV1644y1M7zv?vd_source=ddc0c3418868b72b2e688c97e6f7a3eahttp://【C++进阶STL容器语法(栈、队列、堆、map、set)】https://www.bilibili.com/video/BV1644y1M7zv?vd_source=ddc0c3418868b72b2e688c97e6f7a3eahttp://【【C++】算法竞赛常用 STL 用法】https://www.bilibili.com/video/BV1L8411y7th?vd_source=ddc0c3418868b72b2e688c97e6f7a3ea
http://【【C++】算法竞赛常用 STL 用法】https://www.bilibili.com/video/BV1L8411y7th?vd_source=ddc0c3418868b72b2e688c97e6f7a3ea
如果觉得以上视频帮助不大的uu,也可以自行去搜索ACM竞赛基本的讲解一部分就是关于STL容器的可以自己去学习,那么就进入今天的刷题吧(今天的题目我上机试的时候已经遇见了,不过那个时候只顾刷机试的相关类型的题目了,原来那个时候就已经遇见了hash表了,所以呀在面对任务时我会一心只顾任务而忘记了去关注任务相关的内容,这也是我现在想系统刷题的目的吧,把自己遗漏的、当初没有好好学的都趁着这段时间补上吧,顺嘴说一下如果有uu想了解计算机考研的也可以私信我,我也可以给各位25想考研的uu们一些个人建议,当然也是免费的,也算是我的一点小祝愿吧)。
二、题目(力扣第242题—有效的字母异位词. - 力扣(LeetCode))
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
三、题解
这个题目的意思就是统计两个词中所有的字母个数,若所含字母个数一样则判断为true否则为false,理解起来还是很简单的(我们当时的上机题目有一道与此非常类似,我也大概说一下题目,就是统计一句英文中出现频率最高的字母,返回字母出现的次数和该字母。与此题几乎一模一样的思路可以说,接下来就讲讲吧)。照例我把卡哥的讲解放在了这里,我和卡哥的思路基本是一样的,不过卡哥的代码更加简洁、明了,这也是我还不具备的能力,还需要再练。(卡哥的讲解:代码随想录)。
思路还是很简单的,使用hash表(hash表的作用就是来判断一个元素是否已经出现在hash表里,通常可以使用数组、vector、set、map都是可以充当hash表的)。因此此题的目的就是检验两个string所含字母是否相同,那么就可以使用最坚定的hash表形式,数组即可。将一个string里的字母逐个存入数组中,同时因为字母种类是有限的且ASC||码是连续的,所以是可以使用数组的,否则 只能使用set或者map,这两种后面会练习到。
bool isAnagram(string s, string t) {
vector<int> vecs(26,0);//设置两个数组,长度为26赋初值为0
vector<int> vect(26,0);
int ls=s.size();//得到两个字符串长度
int lt=t.size();
if(ls!=lt)return false;//若字符串长度都不一样,则返回false即可
else{
for(int i=0;i<ls;i++){//将第一个字符串中的字母及次数存入vecs中,比如vecs【0】代表a,其值代表a出现的次数
vecs[s[i]-'a']++;
}
for(int i=0;i<lt;i++){//同理将第二个字符串的字母及次数存入vect
vect[t[i]-'a']++;
}
for(int i=0;i<26;i++){//比较每个字母是否出现以及出现的次数
if(vecs[i]!=vect[i]){
return false;
break;
}
}
return true;
}
}
该算法中最重要的就是使用数组vec[s[i]-'a']来代表每个字母然后vec[s[i]-'a']的值来代表其出现的次数,若为0则说明未出现。其中最重要的就是字母是有限的(26个)且其ASC||是连续的,我就用字母减去‘a’即可,比如‘a’-‘a’就等于0,vec[‘a’-‘a’]=vec[0]就代表a,其值就代表a出现的次数,以此类推其他字母即可。
四、后记
进入了hash表,也就算是进入了第一个我认为比较难的数据结构了,这个部分需要好好跟着卡哥学习、练习,去熟悉set、map等以前不常用的数据结构。各位uu们加油加油,坚持住,我们都会有自己的收获,我们都有光明的未来!!!