刷题日记——有效的字母异位词

47 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 16 天,点击查看活动详情

242.有效的字母异位词

力扣题目链接(opens new window)

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

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

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

说明:  你可以假设字符串只包含小写字母。

思路

数组其实就是一个简单的哈希表没在这道题目中,字符串只有小写字母,所以就可以用一个简单的数组来记录字符串里字符出现的次数。

思路很简单,先将s中存在的字母在数组中对应的位置都加一,然后在将t中存在的字母在数组中所对应的位置都减一,这时遍历数组,如果s和t能一一对应,那么数组其实是没有变化的,所有元素依然都为0,但是如果s和t有不一样的字母,那么数组中肯定不是全为零的,我们只要遍历到有一个元素不为零,就可以直接返回false。

什么时候用数组、set、map

  • 数组:哈希值比较小,范围可控(较小)时,用数组。
  • set:数值很大就用set
  • map:如果k对应value就用map

解法

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

然后又用js做了一遍,思路是一样的,但是注意js中获取ACSII码的写法"a".charCodeAt(),以及直接在关于t的循环中判断是否符合条件,这里很巧妙,因为上来给hash数组所有元素都赋值为0,如果s中没有这个字母,那么hash[i]就是0,此时可以直接判断出来s中没有这个字母,所以就不对了,可以直接return false

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if(s.length != t.length) return false;
    const hash=new Array(26).fill(0);
    for(const i of s){
        hash[i.charCodeAt()-"a".charCodeAt()]++;
    }
    for(const i of t){
        if(!hash[i.charCodeAt()-"a".charCodeAt()]) return false;
        hash[i.charCodeAt()-"a".charCodeAt()]--;
    }
    return true;
};