【JS每日一算法:剑指Offer系列】🟩162.有效的字母异位词(数组、哈希表)

67 阅读2分钟

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

 

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 数组   TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} s 给定字符串s
 * @param {*} t 给定字符串t
 * @return {*}
 */
function array(s, t) {
    /**
     * 本题使用数组的方式,由于字符串中仅
     * 存在小写字母,因此我们可以通过构建
     * 一个26位的数组,利用数组记录字符串
     * 中a-z的字符数量即可
     */
    // 如果两者长度不一致,肯定不为字母异位词
    if (s.length != t.length) return false
    // 定义一个26位的数组记录单词数量
    let wordList = new Array(26).fill(0)
    // 遍历字符串
    for (let i = 0; i < s.length; i++) {
        // 记录单词数量
        wordList[s.charCodeAt(i) - 97]++;
        wordList[t.charCodeAt(i) - 97]--;
    }
    // 遍历数组,如果某个单词数量不为0,则
    // 证明两字符串中该单词数量不一样
    for (let i = 0; i < 26; i++)if (wordList[i] != 0) return false
    return true
}



/**
 * @description: 哈希表  TC:O(n)  SC:O(n)
 * @author: JunLiangWang
 * @param {*} s 给定字符串s
 * @param {*} t 给定字符串t
 * @return {*}
 */
function hashMap(s, t) {
    /**
     * 本题使用哈希表的方式,与上述使用
     * 数组的方式思路一样,利用哈希表记
     * 录字符串中单词的数量
     */

    // 如果两者长度不一致,肯定不为字母异位词
    if (s.length != t.length) return false
    // 定义哈希表
    let map = new Map
    // 遍历字符串s,在hashMap中记录单词
    for (let i = 0; i < s.length; i++) {
        let count = map.get(s[i])
        map.set(s[i], count == undefined ? 1 : count + 1)
    }
    // 遍历字符串t
    for (let i = 0; i < t.length; i++) {
        let count = map.get(t[i])
        // 如果hashMap中单词数量为0,或没有
        // 这个单词,证明两字符单词数量不一致
        if (count == 0 || count == undefined) return false
        map.set(t[i], count - 1)
    }
    // 遍历hashMap,如果存在数量不为0的单词
    // 证明两字符单词数量不一致
    for (let key in map) if (map.get(key) != 0) return false

    return true
}