代码随想录笔记[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
-
s
和t
仅包含小写字母
进阶: 如果输入字符串包含 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进行操作了