重刷leetcode-day1-[242. 有效的字母异位词]

62 阅读1分钟

image.png

【题目考察】:哈希法、数组

【目标复杂度】:O(n)

【解法】:

解法1: 暴力解法

遍历s,查找每个字母是否在t出现过,如果出现过,t中字母删去生成新的t,继续查找,或者用一个数组存下查找过的下标,下次跳过,依次遍历s,找不到就直接返回false。不过这个方法比较蠢,不建议。

解法2: 哈希法,数组

题目中提及了s和t仅包含小写字母,那么使用一个长度26的数组即可表示题目中的一个字符串中所有的字母出现的个数。定义数组records,初始值为0,遍历s,将对应字母的下标减去97(字符a的ASCII码),对应位置的值加1,就可以统计出s中每个字符出现的次数。接着遍历t,遍历t的时候对t中出现的字符,records中的数量就减去1。

最后遍历records,如果都为0,那么表示s和t中的每个字符出现的次数都是一样的,那么就返回true,否则返回false。

【代码】:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    const record = new Array(26).fill(0);
    for (let i = 0; i < s.length; i++) {
        record[s[i].charCodeAt() - 97]++;
    }
    for (let i = 0; i < t.length; i++) {
        record[t[i].charCodeAt() - 97]--;
    }
    for (let i = 0; i < 26; i++) {
        if (record[i] === 0) {
            continue;
        }
        return false;
    }
    return true;
};