详解 LeetCode 第 242 题 - 有效的字母组
目录
题目描述
解题思路
代码分析
步骤说明
图解原理
优势分析
小结
码题目:LeetCode 242. 有效的字母组
题目描述
给定两个字符串 s
和 t
,请判断是否为字母组(Anagram)。
如果
t
是通过打乱s
的字符并重新排列所得到的,那么它们是字母组。
例如:
输入: s = "anagram", t = "nagaram"
输出: true输入: s = "rat", t = "car"
输出: false
解题思路
我们需要确认两个字符串是否含有相同的字符,并且各字母出现的次数也相同。
这里使用 JavaScript 中的 Map
类型来统计字母的出现次数是非常有效的方法。
代码分析
var isAnagram = function (s, t) {if (s.length !== t.length) return false;const 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);}return Array.from(map.values()).every((value) => value === 0);
};
步骤说明
-
长度判断:如果
s
和t
的长度不等,直接返回false
。 -
Map 统计:
-
通过
for
循环,同时遍历s[i]
和t[i]
。 -
将
s[i]
的计数 +1,t[i]
的计数 -1。 -
如果是字母组,那么最后 Map 里所有值必然是 0
-
-
结果判断:判断 Map 所有 value 是否都等于 0,如果是,则返回
true
,否则返回false
。
图解原理
以 s = "anagram"
, t = "nagaram"
为例,观看 Map 如何变化:
第 1 次:s[0] = 'a' → map[a] = 1t[0] = 'n' → map[n] = -1第 2 次:s[1] = 'n' → map[n] = 0t[1] = 'a' → map[a] = 0第 3 次:s[2] = 'a' → map[a] = 1t[2] = 'g' → map[g] = -1第 4 次:s[3] = 'g' → map[g] = 0t[3] = 'a' → map[a] = 0第 5 次:s[4] = 'r' → map[r] = 1t[4] = 'r' → map[r] = 0第 6 次:s[5] = 'a' → map[a] = 1t[5] = 'a' → map[a] = 0第 7 次:s[6] = 'm' → map[m] = 1t[6] = 'm' → map[m] = 0
最终 map = {a:0, n:0, g:0, r:0, m:0} → 全部值为 0,说明是字母组
优势分析
-
时间复杂度: O(n)
-
空间复杂度: O(1)(因为最多字母数量是有限的)
此算法方案相比直接排序字符串后比较的方法而言,更加高效。
小结
该题目是实际中常见的字符组合问题,本解法利用 Map 展现了非常高效的计数思路。推荐在做类似字符组问题时使用。