Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
菜鸟就要从第21题继续
一、题目描述:
给定两个字符串 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 字符怎么办?你能否调整你的解法来应对这种情况?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
第一版:直观上想,分别统计两种中每个字符的频率,然后对比下就可以。这里第一次写忘了考虑s被t包含对的情况。
第二版:由于要求数据两一致,理论上只要各循环一次即可,第一次加1,第二次减1
codePointAt()方法返回 一个 Unicode 编码点值的非负整数。
排序:这个思路开始没想到,其实说通了也没啥,就是按顺序排一遍然后比较,代码量很少。[...s].sort().join('') === [...t].sort().join('')的判断方式很不错
- ...是es6中出现的扩展运算符。作用是遍历当前使用的对象能够访问到的所有属性,并将属性放入当前对象中。这里深拷贝了个数组出来
- sort()排序
- join('')合并,这里将数组元素转换为字符串(无分隔符)默认分隔符是逗号 (,)。
注意这里如果不用join会直接对比对象,不会相等。
三、AC 代码:
1、第一版
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.length!=t.length){
return false
}
const smap = _.countBy(s)
const tmap = _.countBy(t)
for(let item in smap){
if(tmap[item]!=smap[item]){
return false
}
}
return true
};
2、第二版
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if (s.length !== t.length) {
return false;
}
const table = new Array(26).fill(0);
for (let i = 0; i < s.length; ++i) {
table[s.codePointAt(i) - 'a'.codePointAt(0)]++;
}
for (let i = 0; i < t.length; ++i) {
table[t.codePointAt(i) - 'a'.codePointAt(0)]--;
if (table[t.codePointAt(i) - 'a'.codePointAt(0)] < 0) {
return false;
}
}
return true;
};
3、排序
var isAnagram = function(s, t) {
return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};