【题目考察】:哈希法、数组
【目标复杂度】: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;
};