力扣刷题Days7第二题--242.有效的字母异位词(js)

目录

1,题目

2,代码

2.1 我思考完成的-初版--哈希表思想

2.2略改进

2.3排序思想

3,学习与总结

3.1 判断数组元素是否都为0

3.2总结


1,题目

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

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


2,代码

2.1 我思考完成的-初版--哈希表思想

之前题目中有过类似题目,故尝试做了一下;

实现逻辑:

题目要求:s和t中字符出现次数要一样;

因此:

第一步:s和t的字符串长度要一致,否则返回false

第二步:统计s中每个字符出现次数

  •        利用charCodeAt()函数 计算字符的 Unicode 编码;
  •        s[i].charCodeAt()-'a'.charCodeAt() 的结果 即可作为数组的下标;

第三步:统计t中每个字符出现次数

  • 在s字符串处理后的cts[]数组的基础上,进行 cts[t[i].charCodeAt()-'a'.charCodeAt()]-- 操作,实现对同一个字母出现次数的 正负计算;

第四步:判断cts数组中元素是否全为0

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {

    if(s.length != t.length){
        return false;
    }
    const len = s.length;
    let cts=new Array(26).fill(0)
    for(let i=0;i<len;i++){
        cts[s[i].charCodeAt()-'a'.charCodeAt()]++;
    }
    for(let i=0;i<len;i++){
        cts[t[i].charCodeAt()-'a'.charCodeAt()]--;
    }
    return cts.some(item=>item!=0)?false :true

};

2.2略改进

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {

    if(s.length != t.length){
        return false;
    }

    const len = s.length;
    let cts=new Array(26).fill(0)
    for(let i=0;i<len;i++){
        cts[s[i].charCodeAt()-'a'.charCodeAt()]++;
        cts[t[i].charCodeAt()-'a'.charCodeAt()]--;
    }
    
    return cts.some(item=>item!=0)?false :true

};

没有必要两个for循环,一开始我害怕由于s和t中某字符出现先后顺序不同,从而有负值,经过二次思考,理解只要遍历结束 时,满足出现总次数为0即可;

2.3排序思想

分析:t 是 s 的异位词等价于「两个字符串排序后相等」。

var isAnagram = function(s, t) {
    return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};

作者:力扣官方题解
  • [...s][...t]:这里使用扩展运算符...将字符串st转换为字符数组。这样做是为了能够使用数组的sort方法。
  • .sort():对字符数组进行排序。默认情况下,sort方法按照字符编码的顺序对数组元素进行排序。
  • .join(''):将排序后的字符数组通过空字符串连接起来,转换回字符串。这样,如果st是字谜的话,它们排序后应该得到完全相同的字符串。
  • ===:使用严格等于运算符比较两个排序并重新连接成字符串的结果是否完全相等。

3,学习与总结

3.1 判断数组元素是否都为0

方法一:some()

var arr = [0, 0, 0, 0, 0, 0]
console.log(!arr.some(item => item !== 0)) //true

方法二:eval()对字符串求和

var arr = [0, 0, 0, 0, 0, 0];
console.log(eval(arr.join("+"))==0);  //true

3.2总结

共两种思路

哈希表:借助数组构造

排序:涉及 字符串到数组的转换 数组到字符串的转换


勉励自己:坚持一周啦!贵在坚持!

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值