第三章哈希表_有效字母的异位词

我真的服了,我再也不会吃学校外面的鱿鱼了。gou都不吃!!!!!虽然很香,但是很窜啊。受不了了。

ok话不多说,进入流程

吾日三省吾身

比那个男人帅吗?

比那个男人爱她吗?

比那个男人有实力吗?

 省毕,学习


今天直接来到了哈希表的章节了,感觉是挺快的,这是因为前面的数组和链表的操作都还挺简单的。等到后面学习二叉树的时候就真的有点裂开了,我也不确定能不能一天一更了。

Hash表简介

其实常见的hash表很多只要你学过Java基础就应该知道了。比如数组,集合中的set和map,这里就不提具体的实现类了。这些都挺好用。

使用哈希表的场景

一般使用哈希表都是在比如根据什么东西去查询什么东西,这种就是哈希表的标准使用场景。


力扣题号:242. 有效的字母异位词

下述题目描述和示例均来自力扣

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。


示例

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

思路

Java解法一:采用Map集合作为哈希表

其实这个法子我是第一个想到的,因为map的key存字母,然后value存字母出现的次数真的是太适合map的key和value结构了。先存,再删,然后判断只要数量小于0了,直接false

这里在说一下一个map集合的API,getOrDefault(key, defaultValue,他第一个值填一个元素,第二个值填默认元素,然后会去map中找第一个元素,有的话返回value,没有就返回默认值。

class Solution {
    public boolean isAnagram(String s, String t) {
        //还是先转为字符数组
        char[] charS = s.toCharArray();
        char[] charT = t.toCharArray();
        //长度不同返回false
        if (charS.length != charT.length){
            return false;
        }
        
        //开始存入map集合,key是字母,value是字母出现的次数
        //记住了,map的泛型里面是引用类型不是基本数据类型
        HashMap map = new HashMap<>();
        //开始遍历s存数
        for (int i = 0; i < charS.length; i++) {
            map.put(charS[i],map.getOrDefault(charS[i],0) + 1);
        }
        
        //减少次数
        for (int i = 0; i < charT.length; i++) {
            if (map.containsKey(charT[i])) {
                //有,次数(value)减一
                map.replace(charT[i],map.get(charT[i]) - 1);
                if (map.get(charT[i]) < 0){
                    //数量不够,错
                    return false;
                }
            }else {
                //这里就意味着根本就不包含这个字母
                return false;
            }
        }
        return true;
    }
}

该说不说,能过是能过,但是还是太慢了,不知道我这个代码有没有优化的空间啊。欢迎各位大侠讨论 

第三章哈希表_有效字母的异位词_第1张图片


 

Java解法二:采用数组作为哈希表

虽然说Java通过charAt也可以操作字符串中的每一个字符,但是过于麻烦,而且这里也不需要返回字符串,操作完也不用重新给拼接回去,所以直接转成数组方便操作。

将charS中的字符存入hash表这里hash表采用数组,为什么使用数组呢=》set一般用于重复的去重,map常用于需要存储多个元素的这里使用map我觉得也行,key是字母,value是数量,使用数组的话就定义26个字母,分别代表a-z,然后数组值代表每个字母出现的数量

class Solution {
    public boolean isAnagram(String s, String t) {
        //先将他俩转换成char数组方便操作
        char[] charS = s.toCharArray();
        char[] charT = t.toCharArray();
        //长度都不一样还解释啥啊错了bro
        if (charS.length != charT.length){
            return false;
        }
        //然后将charS中的字符存入hash表
        //这里采用数组,set一般用于重复的去重
        //map常用于需要存储多个元素的
        //这里使用map我觉得也行,key是字母,value是数量
        //使用数组的话就定义26个字母,分别代表a-z,然后数组元素代表每个字母出现的数量
        int[] res = new int[26];
        
        //遍历charS
        for (int i = 0; i < charS.length; i++) {
            res[charS[i] - 'a']++;
        }
        //然后遍历charT删除res中的元素
        for (int i = 0; i < charT.length; i++) {
            res[charT[i] - 'a']--;
            if (res[charT[i] - 'a'] < 0){
                return false;
            }
        }
        return true;
    }
}

速度直接打败了全世界人!!!!!!!!!!!

但是这里就暴露出来的哈希表的缺点,因为要额外的开辟空间存储一些东西,所以内存一般占得多,但是够快。内存和速度的取舍就看具体情况了。 

第三章哈希表_有效字母的异位词_第2张图片

哈哈哈哈哈哈哈哈哈哈哈哈,害,哈希表的题也就这样吧,简简单单随随便便的啦~~

ε=(´ο`*))),所以数组那么多年了但是知根知底,map刚刚认识但是不知底细。好像map很好相处,所以你会放弃数组选择map吗?就像你会放弃你现在身边的那个人选择新闯入你生活的这个人吗?我不会,期待你也不会

see you

记得每日三省~~ 

你可能感兴趣的:(我的算法记录,散列表,哈希算法,数据结构,java,算法)