Skip to content
On this page

242-有效的字母异位词

标签:哈希表 字符串 排序

题目信息

题目地址242. 有效的字母异位词

题目内容:

javascript
给定两个字符串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字符怎么办?你能否调整你的解法来应对这种情况?

题解

解法一

思路:

分别遍历st字符串,将字符串中的字符出现的次数记录下来,最后比较两个字符串出现的次数是否相同

代码实现:

javascript
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    // 俩字符串一样 返回true
    if(s === t) return true
    // 字符串个数不相等 直接返回false
    if(s.length !== t.length) return false
    // 获取每个字符串的个数 返回一个obj key就是当前字符串 value就是当前字符串出现了几次
    const getStrCount = str => {
        const countData = {}
        for(let i = 0; i < str.length; i++) {
            const curStr = str[i]
            const curStrCount = countData[curStr]
            if(!!curStrCount) {
                countData[curStr] = curStrCount + 1
                continue
            }
            countData[curStr] = 1
        }
        return countData
    }
    const sCount = getStrCount(s)
    const tCount = getStrCount(t)
    for(const str in sCount) {
        if(sCount[str] !== tCount[str]) return false
    }
    return true
};

解法二

思路:

先遍历字符串s,将每个字母出现的次数记录下来到对象sCountData中,然后遍历字符串t,每个字母出现一次就将其记录的个数减1,如果最后sCountData中每个字母出现的次数都为0,则返回true,否则返回false

javascript
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    // 俩字符串一样 返回true
    if(s === t) return true
    // 字符串个数不相等 直接返回false
    if(s.length !== t.length) return false
    // 获取每个字符串的个数 返回一个obj key就是当前字符串 value就是当前字符串出现了几次
    const getStrCount = str => {
        const countData = {}
        for(let i = 0; i < str.length; i++) {
            const curStr = str[i]
            if(countData[curStr]) {
                countData[curStr] = countData[curStr] + 1
                continue
            }
            countData[curStr] = 1
        }
        return countData
    }
    const sCountData = getStrCount(s)
    for(let j = 0; j < t.length; j++) {
        const str = t[j]
        sCountData[str] = --sCountData[str]
    }
    return !Object.keys(sCountData).some(k => sCountData[k] !== 0)
};

解法三

思路:

获取两个字符串中的字母的Unicode值,然后按照相同顺序排序,然后将排序好的数组通过join方法转为字符串,判断最终生成的两个字符串是否相等

javascript
/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    // 俩字符串一样 返回true
    if(s === t) return true
    // 字符串个数不相等 直接返回false
    if(s.length !== t.length) return false
    const genStrCharCode = str => {
        const charCodes = str.split('').map(item => item.charCodeAt())
        return charCodes.sort((a, b) => a - b).join('')
    }
    return genStrCharCode(s) === genStrCharCode(t)
};