给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
思考
我开始的想的是,分别遍历s,t,用map存储里面的字母:数量。最后再一一比较。这样首先要遍历两次,而且键的顺序也不一定。
另一种思路,只需要用一个map。
首先判断两个长度是不是一样,不一样直接返回false.
然后同时遍历两个字符串,
s里的字母,存在的话,值+1,不存在的话,加到map,初始化为1.
t里的字母,存在的话,值-1,不存在的话,加到map,初始化为-1.
这样遍历结束,两个是异位词的话,必然所有键的值都是0.
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if (s.length !== t.length) {
return false
}
const map = new Map()
for (let i = 0; i < s.length; i++) {
//如果有s中字母,对应值加一
if (map.has(s[i])) {
map.set(s[i], map.get(s[i])+1)
}else {
//没有的字母,初始值设为1
map.set(s[i],1)
}
//如果有t中的字母,对应值减一
if(map.has(t[i])) {
map.set(t[i], map.get(t[i])-1)
}else {
//没有出现过的初始值设为-1
map.set(t[i], -1)
}
}
//每次读的是item,item是一个数组[key,value]
for (let ietm of map) {
if (item[1] !== 0) {
return false
}
}
return true
};
知识
1.遍历map的时候,用for of 才能返回。而且注意每次读取的是item,包含key和value.