> 文章列表 > 代码随想录笔记[20] ASCII码代替HASH函数

代码随想录笔记[20] ASCII码代替HASH函数

代码随想录笔记[20] ASCII码代替HASH函数

242 有效的字母异位词

242. 有效的字母异位词

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length, t.length <= 5 * 104

  • st 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

思路

  • 字母异位词的原理就是每个字母出现的次数相同,我们可以借助于数组来完成

  • 创建一个长度为26的int数组,先遍历第一个字符串,字母出现一次,c-'a' 下标的数组的值就++ 同理,在遍历第二个字符串,如果字母出现一次,c-'a'下标对应的数组的值就--

  • 最后遍历我们的数组,如果数组存在非0值,则返回false

  • c-'a'来求出下标的这一操作其实跟hashmap里面hash函数计算函数值是相同的原理,只要你是相同的东西,你就会去相同的存储位置

  • 只不过我们这里是用字符的ASCII码来代替我们的hash函数

方法一 数组模拟hash表

class Solution {public boolean isAnagram(String s, String t) {int[] count = new int[26];for(char c : s.toCharArray()){count[c-'a']++;}for(char c : t.toCharArray()){count[c-'a']--;}for(int i = 0;i<26;i++){if(count[i]!=0){return false;}}return true;}
}

方法二 正宗hash表

class Solution {public boolean isAnagram(String s, String t) {HashMap<Character,Integer> myhash = new HashMap<Character,Integer>();if(s.length()!=t.length()){return false;}for(char c : s.toCharArray()){myhash.put(c,myhash.getOrDefault(c,0)+1);}for(char c : t.toCharArray()){myhash.put(c,myhash.getOrDefault(c,0)-1);if(myhash.get(c)<0){return false;}}return true;
​}
}
  • hash表的逻辑跟我们数组的一样,唯一多了一个难点,我们怎么样才能更新我们对应字母出现次数的值呢?

  • java的hashmap类里面为我们提供了方法 getOrDefault(key,val)

  • 这个方法会帮助我们得到key值对应的val,如果不存在的话,则返回默认值 val ,这样,我们就可以对表中的val进行操作了