前端锦囊-Valid Anagram

52 阅读2分钟

有效的字母异位词(Valid Anagram)

题目描述:

给定两个字符串 st,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例:


输入:s = "anagram", t = "nagaram"

输出:true


输入:s = "rat", t = "car"

输出:false

解题思路:

  1. 排序法
  • 将两个字符串分别排序,然后比较排序后的结果是否相同。

  • 时间复杂度:O(n log n),空间复杂度:O(1)。

  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 个字母)。