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++ 做的排序,灵光一闪也做了,不得不说这种解法很简洁优雅。应该是有史以来使用解法最多的一题了