Hash
Last updated
Last updated
//obj version
var groupAnagrams = function (strs) {
const hash = {}
for (let str of strs) {
//sort后相同的字母组成的不同的字符串肯定是相同的
const key = [...str].sort().toString()
hash[key] ? hash[key].push(str) : (hash[key] = [str])
}
return Object.values(hash)
}
//使用计数器做key,可以去掉sort的时间复杂度 O(NK) - O(NK)
//best version
var groupAnagrams = function (strs) {
const hash = {},
key = new Array(26)
for (let str of strs) {
key.fill(0)
for (let i = 0, len = str.length; i < len; i++) {
key[str.charCodeAt(i) - 'a'.charCodeAt(0)]++
}
hash[key] ? hash[key].push(str) : (hash[key] = [str])
}
return Object.values(hash)
}
var longestConsecutive = function (nums) {
const set = new Set(nums)
let ret = 0
for (let num of nums) {
//当不存在num - 1时才从num开始枚举以跳过重复枚举的情况
if (!set.has(num - 1)) {
let cur = num,
curMaxLen = 1
while (set.has(cur + 1)) {
cur++
curMaxLen++
}
ret = Math.max(ret, curMaxLen)
}
}
return ret
}
//使用系统内置函数sort O(NlogN) n为字符串长度 - O(1)
var isAnagram = function (s, t) {
return (
s.length === t.length && [...s].sort().join('') === [...t].sort().join('')
)
}
//hash optimal
//good version
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
const hash = {}
for (let c of s) {
hash[c] ? hash[c]++ : (hash[c] = 1)
}
for (let c of t) {
if (hash[c]) {
hash[c]--
//meet return immediately
} else {
return false
}
}
return true
}
//use array store each letter
var isAnagram = function (s, t) {
if (s.length !== t.length) return false
const arr = Array.from({ length: 26 }, () => 0),
len = s.length
const base = 'a'.charCodeAt(0)
for (let i = 0; i < len; i++) arr[s.charCodeAt(i) - base]++
for (let i = 0; i < len; i++) {
if (--arr[t.charCodeAt(i) - base] < 0) return false
}
return true
}
//brute force
var numJewelsInStones = function (J, S) {
let ret = 0
for (let s of S) {
for (let j of J) {
if (s === j) {
ret++
break
}
}
}
return ret
}
var numJewelsInStones = function (J, S) {
let ret = 0,
set = new Set()
for (let j of J) set.add(j)
for (let s of S) {
if (set.has(s)) ret++
}
return ret
}