最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    正文概述 掘金(Orime小猪)   2021-03-11   802

    [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    题目名称:判定是否互为字符重排

    给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

    示例 1:

    输入: s1 = "abc", s2 = "bca"
    输出: true 
    
    示例 2:
    
    输入: s1 = "abc", s2 = "bad"
    输出: false
    

    说明:

    0 <= len(s1) <= 100 0 <= len(s2) <= 100

    解法

    一、采用哈希表(对象)判断结构是否一致

    • 注意题目有个前提条件是两个字符串长度一致
    • 另一个前提条件是字符串中出现的字符的数量要严格对应
    • 一个简单的思路就是使用哈希表存储每个字符出现个数,再判断结构是否一致
    /**
     * @param {string} s1
     * @param {string} s2
     * @return {boolean}
     */
    var CheckPermutation = function(s1, s2) {
      if(s1.length !== s2.length) return false
      const map1 = getCount(s1)
      const map2 = getCount(s2)
      if(Object.keys(map1).length !== Object.keys(map2).length) return false
      let res = true
      for(let [k, v] of Object.entries(map1)){
        if(v !== map2[k]){
          res = false
          break
        }
      }
      return res
    };
    
    function getCount(str){
      const map = {}
      for(let v of str){
        map[v] = map[v] ? map[v]+1 : 1
      }
      return map
    }
    

    二、排序法

    • 直接排序看是否相等
    /**
     * @param {string} s1
     * @param {string} s2
     * @return {boolean}
     */
    var CheckPermutation1 = function(s1, s2) {
      return s1.split('').sort().join('') === s2.split('').sort().join('')
    };
    

    三、一次循环就地删除法

    /**
     * @param {string} s1
     * @param {string} s2
     * @return {boolean}
     */
    var CheckPermutation2 = function(s1, s2) {
      //长度不对等,肯定不行的
      if(s1.length!=s2.length){
          return false;
      }
      s2 = s2.split('');
      //直接循环
      for(let s of s1){
          if(s2.indexOf(s)==-1){
              return false;
          }else{
            // * 如果能够找到则就地删除
              s2.splice(s2.indexOf(s),1);
          }
      }
      return true;
    };
    

    测试用例

    // 测试用例
    let s1 = "abc", s2 = "acbd"
    
    console.time('执行用时');
    console.log(CheckPermutation1(s1, s2));
    console.log(CheckPermutation2(s1, s2));
    console.timeEnd('执行用时');
    

    总结

    • 一个对象的Object.entries返回这个对象键值对的数组

    [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    • 数组的sort方法如果参数不传,则使用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
      • 字符串情况

    [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    • 数字情况

    [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    • 结论:通常情况下字符串可以不传参数,但数字数组如果涉及到比较大小必须传入compareFunction才能获得争取的排序结果

    说明

    1. 本题解已同步GitHub地址,可以复制代码进行调试。
    2. 总结出了一套亲测有效的前端无痛刷题项目,有助于算法小白平稳入门,详见leetcode-js-roadmap,希望对从零开始刷题的前端小伙伴们带来帮助~

    本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情


    起源地下载网 » [ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元