「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
首先我们可以通过JS的特性进行排序,我们将字符串通过split拆解成数组,然后对两个数组分别进行排序。sort根据字符串**Unicode**码点进行排序,如果两个字符串是字母异位词,那么排序过后的两个数组每个位置上的字母都应该相同,为了减少通过for遍历带来的时间复杂度,我们直接将数组再通过join组成字符串,再次对比排序过后的字符串,如果相同,则证明两个字符串是字母异位词。
var isAnagram = function (s, t) {
return s.length === t.length&&s.split('').sort().join()===t.split('').sort().join()
}
正常情况下,我们可以使用hash对其中一个字符串进行储存,然后用另一个字符串进行对比。
我们对第一个字符串进行遍历,将每个字母都存入map表中,如果相同字母的个数大于一个,则再map表中对该字母的个数进行累加,遍历完第一个数组之后,对第二个字符串也进行遍历,如果再第一个map中没有找到第二个字符串中的词,则直接证明两个字符串不是字母异位词。如果有,则再第一个数组中将该词的记录数量减一,直至第二个字符串遍历完毕,如果第二个字符串里面的词在第一个map中全部存在,此时再判断map中是否还有多余的词,如果有则不是字母异位词,如果map为空,则证明是字母异位词。
var isAnagram = function (s, t) {
let n = s.length;
let m = t.length;
if (s.length !== t.length) return false;
let map = new Map();
// 对S进行遍历
for (var i = 0; i < m; i++) {
// Map 中有的数量+1,不存在的储存
if (!map.has(s[i])) {
map.set(s[i], 1)
} else {
map.set(s[i], map.get(s[i]) + 1)
}
}
// 对T进行遍历,从map中减去已经遍历的。如果map中不存在或者map中最后有剩余,则返回FALSE
for (var i = 0; i < n; i++) {
if (!map.has(t[i])) return false
else {
map.set(t[i], map.get(t[i]) - 1)
}
if (map.get(t[i]) < 0) return false
}
return true
};