Skip to content

242. 有效的字母异位词

解题过程

INFO

题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词

javascript
/**
 * @link https://leetcode.cn/problems/valid-anagram/
 * @title 242. 有效的字母异位词
 * @description 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
 * 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
// 解法一
// 思路:跟昨天的383解法一相同,添加一下前置判断即可:统计s字符出现的次数然后再统计t出现的字符次数即可
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false
  }

  const sMap = new Map()
  for (const key of s) {
    sMap.set(key, (sMap.get(key) || 0) + 1)
  }

  for (const key of t) {
    if (sMap.has(key) && sMap.get(key) !== 0) {
      sMap.set(key, sMap.get(key) - 1)
    } else {
      return false
    }
  }

  return true
};

// 解法二
// 思路:跟383解法二一直,修改一下条件判断即可
// 缺点:还是只想结果比较差问题,执行用时达到6秒
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false
  }

  for (let i = 0; i < s.length; i++) {
    const reg = new RegExp(`${s[i]}`, 'g')
    if ((s.match(reg)?.length || 0) !== (t.match(reg)?.length || 0)) {
      return false
    }
  }

  return true
}

// 解法三
// 思路:同383解法三,修改一下判断条件即可
// 缺点:执行用时比解法二好一丢丢
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false
  }

  const newStr = s.split('')

  for (let i = 0; i < t.length; i++) {
    if (newStr.includes(t[i])) {
      const index = newStr.findIndex(item => item === t[i])
      newStr.splice(index, 1)
    } else {
      return false
    }
  }

  return true
}

// 解法四
// 思路:同昨天做的383解法四一致,修改下判断条件
// 缺点:执行用时比较大
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false
  }

  for (let i = 0; i < s.length; i++) {
    if (t.includes(s[i])) {
      t = t.replace(s[i], '')
    } else {
      return false
    }
  }

  return true
}

// 解法五
// 思路:字符串很多解法都用到了哈希表值来做的,之前也看到很多字符串题解有类似的解法,所以想到用这个方法来做:统计s的数组字符出现次数,遍历t统计出现次数判断即可
var isAnagram = function (s, t) {
  if (s.length !== t.length) {
    return false
  }

  const strArr = new Array(26).fill(0)
  // 为了方便理解定义变量获取值方式
  // const start = 'a'.charCodeAt()

  for (const key of s) {
    strArr[key.charCodeAt() - 97]++
  }

  for (const key of t) {
    strArr[key.charCodeAt() - 97]--
    if (strArr[key.charCodeAt() - 97] < 0) {
      return false
    }
  }

  return true
}

// 解法六
// 思路:使用两个字符串排序,然后判断是否相等接口,一行代码搞定
var isAnagram = function (s, t) {
  // return s.split('').sort((a, b) => b.charCodeAt() - a.charCodeAt()).join('') === t.split('').sort((a, b) => b.charCodeAt() - a.charCodeAt()).join('')

  // 代码优化👆🏻
  return s.length === t.length && [...s].sort().join('') === [...t].sort().join('')
}

// const result = isAnagram('anagram', 'nagaram') // true
// const result = isAnagram('rat', 'car') // false
// const result = isAnagram('ac', 'bb') // false
const result = isAnagram('ab', 'a') // false
console.log(result)

解题感受

这几天做的这几题都是用哈希表解法执行效果更好,也看了很多题解是这样做的。所以用了这种解法,相对昨天 4 种解法也做了一遍,效果跟昨天一样的,只需修改判断条件而已,但哈希表解法确实好用,很快。后面看评论有一个用 C++ 做的排序,灵光一闪也做了,不得不说这种解法很简洁优雅。应该是有史以来使用解法最多的一题了

优质题解