🚀问题描述
给定两个字符串s和t:
- 如果
t是s的异位词,返回true。 - 否则,返回
false。
具体来说,两个字符串是异位词,当且仅当它们包含相同的字符,并且每个字符出现的次数也完全相同
💡示例
示例1
输入:s = "anagram",t = "nagaram"
输出:true
解释:两个字符串具有相同频率的相同字符。
示例2
输入:s = "rat",t = "car"
输出:false
解释:`t`中的字符与`s`中的不同。
🏆JavaScript解决方案
我们可以通过计算两个字符串中字符的频率并比较计数来高效地解决这个问题。
实现
var isAnagram = function(s, t) {
if (s.length !== t.length) return false;
const charCount = {};
for (let char of s) {
charCount[char] = (charCount[char] || 0) + 1;
}
console.log('charCount:', charCount)
for (let char of t) {
console.log('char:', char)
if (!charCount[char]) return false;
charCount[char]--;
console.log('charCount2:', charCount)
}
return true;
};
console.log(isAnagram('anagram', 'nagaram'))
console.log(isAnagram('rat', 'car'))
🔍工作原理
- 计算
s中的字符:
-
- 使用哈希表(
charCount)跟踪s中每个字符的频率。
- 使用哈希表(
- 减少
t中的字符:
-
- 对于
t中的每个字符,在charCount中减少其计数。 - 如果
t中的字符缺失或其计数变为负数,返回false。
- 对于
- 返回True:
-
- 如果所有字符匹配且它们的计数平衡,返回
true。
- 如果所有字符匹配且它们的计数平衡,返回
🔑复杂度分析
- 时间复杂度:
O(n),其中n是s(或t)的长度。
-
- 每个字符处理一次。
- 空间复杂度:
O(1),因为哈希表最多存储26个条目,用于小写英文字母。
📋运行
输入:s = "anagram",t = "nagaram"
输出:true
后续:字符
对于包含字符的输入,可以如下调整解决方案:
- 不是假设小写英文字母,而是允许任何字符作为哈希表中的键。
- 上述实现已经支持这种方法,因为JavaScript哈希表(
{}或Map)可以将任何字符串作为键存储。
✨面试技巧
- 讨论排序方法:
-
- 一种替代解决方案涉及对两个字符串进行排序并比较它们。
- 时间复杂度:
O(nlogn),因为排序。
var isAnagram = function(s, t) {
return s.split("").sort().join("") === t.split("").sort().join("");
};
console.log(isAnagram('', '')) // true
console.log(isAnagram('abc', 'abcd')) // false
Leetcode: leetcode.cn/problems/va…