题目描述
本文题目选取自 LeetCode 242. 有效的字母异位词
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例1:
输入: s = "anagram", t = "nagaram"
输出: true
示例2:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。
思路
本题是一个简单题,主要解题思路是通过统计两个单词的字母和每个元素的出现次数,在 O(N) 次遍历内,我们可以得到想要的结果。统计的方法有很多,比如基于数组、基于 Map 等。
理解了主要思路之后,下面我们结合本题具体的代码,看看如何在代码中做优化。
题解
- 排序后直接比较
var isAnagram = function (s, t) {
if (s.length !== t.length) {
return false;
}
let sortedA = [...s].sort();
let sortedT = [...t].sort();
return sortedA.every((a, i) => a === sortedT[i]);
};
- 基于数组的桶计数并优化循环次数
var isAnagram = function (s, t) {
if (s.length !== t.length) {
return false;
}
let nums = new Array(26).fill(0);
const A = 'a'.charCodeAt(0);
for (let i = 0; i < s.length; i++) {
nums[s.charCodeAt(i) - A]++;
nums[t.charCodeAt(i) - A]--;
}
return nums.every(num => num === 0);
};
- 基于字典统计并提前跳出循环比较
var isAnagram = function (s, t) {
if (s.length !== t.length) return false;
let map = {};
for (let ch of s) {
map[ch] ? map[ch]++ : map[ch] = 1
}
for (let ch of t) {
if (!map[ch] || map[ch] <= 0) return false;
map[ch]--;
}
for (let ch in map) {
if (map[ch] !== 0) return false;
}
return true
};
总结
简单题也要仔细做! 题在精不在多,一题多解可以扩展自己的思路。