有效的字母异位词(Valid Anagram)
题目描述:
给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例:
输入:s = "anagram", t = "nagaram"
输出:true
输入:s = "rat", t = "car"
输出:false
解题思路:
- 排序法:
-
将两个字符串分别排序,然后比较排序后的结果是否相同。
-
时间复杂度:O(n log n),空间复杂度:O(1)。
- 哈希表法:
-
使用一个哈希表(或数组)记录每个字符的出现次数。
-
遍历字符串
s,统计字符出现次数;遍历字符串t,减少字符出现次数。 -
最后检查哈希表中所有字符的出现次数是否都为 0。
-
时间复杂度:O(n),空间复杂度:O(1)(因为字符集大小固定)。
代码实现(排序法):
function isAnagram(s, t) {
if (s.length !== t.length) return false; // 长度不同直接返回 false
return s.split("").sort().join("") === t.split("").sort().join(""); // 排序后比较
}
// 测试
console.log(isAnagram("anagram", "nagaram")); // 输出 true
console.log(isAnagram("rat", "car")); // 输出 false
代码实现(哈希表法):
function isAnagram(s, t) {
if (s.length !== t.length) return false; // 长度不同直接返回 false
const count = new Array(26).fill(0); // 初始化计数数组
for (let i = 0; i < s.length; i++) {
count[s.charCodeAt(i) - 'a'.charCodeAt(0)]++; // 统计 s 中字符出现次数
count[t.charCodeAt(i) - 'a'.charCodeAt(0)]--; // 减少 t 中字符出现次数
}
for (let c of count) {
if (c !== 0) return false; // 如果有字符计数不为 0,返回 false
}
return true; // 所有字符计数为 0,返回 true
}
// 测试
console.log(isAnagram("anagram", "nagaram")); // 输出 true
console.log(isAnagram("rat", "car")); // 输出 false
复杂度分析:
-
排序法:
-
时间复杂度:O(n log n),排序的时间复杂度。
-
空间复杂度:O(1),取决于排序算法的实现。
-
哈希表法:
-
时间复杂度:O(n),需要遍历两个字符串。
-
空间复杂度:O(1),因为字符集大小固定(26 个字母)。