赞
踩
给定两个字符串 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
仅包含小写字母比较字符串内字符的个数相同,很容易想到将各个字符作为一个key 存入一个对象中,个数相同就是这些键值是否相同。
此时会发现存在一个问题:那就是key 的顺序不同也会导致判断不同。所以判断是否相同时需要先将key进行排序。
这种类似于暴力解答,直接进行判断。
/** * @param {string} s * @param {string} t * @return {boolean} */ var isAnagram = function (s, t) { let sHash = {} let tHash = {} for (let i = 0; i < s.length; i++) { if (!sHash[s[i]]) { sHash[s[i]] = 1 continue } sHash[s[i]]++ } for (let i = 0; i < t.length; i++) { if (!tHash[t[i]]) { tHash[t[i]] = 1 continue } tHash[t[i]]++ } console.log(JSON.stringify(sHash)) console.log(JSON.stringify(tHash)) return isEqual(sHash, tHash) }; function isEqual(obj1, obj2) { // 获取对象的键 const keys1 = Object.keys(obj1).sort(); const keys2 = Object.keys(obj2).sort(); // 检查键的数量 if (keys1.length !== keys2.length) { return false; } // 检查键的值是否相等 for (let i = 0; i < keys1.length; i++) { const key = keys1[i]; if (key !== keys2[i] || obj1[key] !== obj2[key]) { return false; } } return true; } console.log(isAnagram('ab', 'a'))
这里讲一下哈希法。
主要思路:就是在 arr 中放26个位置,值全为0。然后遍历 s,在 a-z 的对应位置加 1,然后遍历 t,在 a-z 的对应位置减 1,所以 s 和 t 相同的话,那么所有位置应该还是 0。
js 这里需要用 charCodeAt 获取 ascii 值。
/** * @param {string} s * @param {string} t * @return {boolean} */ var isAnagram = function (s, t) { if (s.length !== t.length) { return false } let arr = new Array(26).fill(0); const base = 'a'.charCodeAt() for (let i of s) { arr[i.charCodeAt() - base]++ } for (let i of t) { arr[i.charCodeAt() - base]-- } for (let i = 0; i < 26; i++) { if (arr[i] != 0) { return false } } return true };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。