思路
假设有字符串 s
和 t
:
- 将两个字符串里的字母排序,排完之后看看两个字符串是否完全相等,时间复杂度 O ( n log 2 n ) O(n\log_2n) O(nlog2n)(快快速排序)。
- 利用一个 Map 结构,
key
是字符串中出现的字母,value
是字母出现的次数。其中s
中出现的字母对于value
是+1
,t
中出现的字母对value
是-1
。最后检查 Map 中每个key
的value
是不是都是0
。时间复杂度 O ( n ) O(n) O(n)。
代码(基于思路2)
➥ JavaScript
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (typeof s !== 'string'
|| typeof t !== 'string'
|| s.length !== t.length) {
return false
}
const map = {}
let result = true
for (let i = 0; i < s.length; i++) {
const char_s = s[i]
const char_t = t[i]
if (typeof map[char_s] === 'number') {
map[char_s] += 1
} else {
map[char_s] = 1
}
if (typeof map[char_t] === 'number') {
map[char_t] -= 1
} else {
map[char_t] = -1
}
}
/**
* 虽然这里有个循环,但对于这道题,key 最多只有 26 个,
* 所以不会影响时间复杂度。
*/
for (let key in map) {
if (map[key] !== 0) {
result = false
break
}
}
return result
};
对于第二个循环的说明
在 Python 中,可以直接通过 ==
判断 2 个 dict 是否相同,所以可以将两个字符串分别存一个 dict,最后直接比较就行了。
但 JS 对象比的是地址,所以不能直接用 ==
来判断。所以循环每个键值是必须的。