这一题是判断字母异位词,开始就想到了排序来判断是否是异位词,但是这里的复杂度比较高,因为排序需要nlogn的时间来处理
使用map来排序也是一个不错的选择,用空间换时间,这里的空间比较值得去换,毕竟也就26个字母,再多也多不到哪里去
只不过当字符串很长时,排序的时间复杂度就变大了,所以这里选择用map还是比较划算的
排序
#### 啰嗦版本
var isAnagram = function (s, t) {
let ss = s.split('')
let ts = t.split('')
var sortChar = function (a, b) {
return a.charCodeAt(0) - b.charCodeAt(0)
}
ss.sort((a, b) => sortChar(a, b))
ts.sort((a, b) => sortChar(a, b))
return ss.join('') === ts.join('')
};
简化版本
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
var sortStr = (str) => str.split('').sort().join('')
return sortStr(s) === sortStr(t)
};
map统计
map啰嗦版
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
let map = new Map()
for (let i = 0; i < s.length; ++i) {
if (map.has(s[i])) {
map.set(s[i], map.get(s[i]) + 1)
} else {
map.set(s[i], 1)
}
if (map.has(t[i])) {
map.set(t[i], map.get(t[i]) - 1)
} else {
map.set(t[i], -1)
}
}
for (let [k, v] of map) {
if (v !== 0) return false
}
return true
};
map精简版
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
let map = new Map()
for (let i = 0; i < s.length; ++i) {
map.set(s[i], (map.get(s[i]) || 0) + 1)
map.set(t[i], (map.get(t[i]) || 0) - 1)
}
for (let v of map.values()) {
if (v !== 0) return false
}
return true
};
数组统计
两个数组
var isAnagram = function (s, t) {
if (s.length !== t.length) return false;
let arr1 = new Array(26).fill(0);
let arr2 = new Array(26).fill(0);
let a = "a".charCodeAt(0);
for (let i = 0; i < s.length; ++i) {
arr1[s[i].charCodeAt(0) - a]++;
arr2[t[i].charCodeAt(0) - a]++;
}
console.log(arr1);
console.log(arr2);
for (let i = 0; i < 26; ++i) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
};
一个数组
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
let cnt = new Array(26).fill(0)
let aCode = 'a'.charCodeAt(0)
for (let i = 0; i < s.length; ++i) {
cnt[s[i].charCodeAt(0) - aCode]++
cnt[t[i].charCodeAt(0) - aCode]--
}
return cnt.every(v => v === 0)
};