242. 有效的字母异位词

300 阅读2分钟

image.png 这个题的解法是比较多的,首先是对于这两个字符串,如果其length不一样就直接GG,随后就是判断其中的字符是否相等,一种想法是先对其进行排序,随后对于两个字符串判断是否相等,因为如果两个字符串是字母异位词,那么这两个单词排完顺序之后的值必然是一样的,同时这里有一个点需要注意的是Array自带的sort()是一个比较坑逼的方法,它默认的不是对数组进行整数次的排序,而是会将item转化为字符串,根据其XXX值进行排序,所以正常情况下我们排序的化需要自己写一个函数,放到sort()的参数位置,从而使得这个排序根据我们自己的想法进行排序,当然在这个题来讲无论怎么排序都是无所谓的,因为哪怕是乱排,两个字符串字符数量一样的情况下乱排的结果也是一样的,所以最简单的就是这样。

var isAnagram = function(s, t) { 
    return s.split('').sort().join('') === t.split('').sort().join('');
};

第二种思路是更加的神奇,不用排序,就是我们定义一个对象,这两个字符如果都是一样的话,一个往里面加一,另一个减一,最后理论上每一个对象的值都是0,这里有两个知识点,一个是对象的创建,可以使用Object.create(null),另一个就是判断其中每一个是否都是0的方法,arr.every(v => !v),every函数返回的是boolean值,即其中每一个item都符合条件,则true,否则false。而v =>!v可以判断这个数是否为0,非0的话都是false(这个可以理解为除了0所有的数字都是true,取非就变成假的了)

var isAnagram = function(s, t) {
    if (s.length !== t.length) return false;
    let h = {};
    for (var i = s.length - 1;i>=0;i--) {
        h[s[i]] = (h[s[i]] || 0) + 1;
        h[t[i]] = (h[t[i]] || 0) -1;
    }
    return Object.values(h).every(v => !v);
};