![[ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡](https://img.wangzhan5u.com/images/5/[ lk ayheywruot3.jpg)
题目名称:判定是否互为字符重排
给定两个字符串 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 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡](https://img.wangzhan5u.com/images/5/[ lk ggyk04kicmm.jpg)
- 数组的sort方法如果参数不传,则使用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
- 字符串情况
 
![[ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡](https://img.wangzhan5u.com/images/5/[ lk mjh32ttia5s.jpg)
- 数字情况
![[ 力扣 01.02 ] 判定是否互为字符重排(三种思路解决) | 刷题打卡](https://img.wangzhan5u.com/images/5/[ lk jieh5slr3ky.jpg)
- 结论:通常情况下字符串可以不传参数,但数字数组如果涉及到比较大小必须传入compareFunction才能获得争取的排序结果
说明
- 本题解已同步GitHub地址,可以复制代码进行调试。
- 总结出了一套亲测有效的前端无痛刷题项目,有助于算法小白平稳入门,详见leetcode-js-roadmap,希望对从零开始刷题的前端小伙伴们带来帮助~
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
 
                     
    ![[路飞]_leetcode-227-基本计算器 II - 掘金](/ripro/timthumb.php?src=/images/titlepic.png&h=200&w=300&zc=1&a=c&q=100&s=1) 
        
      ![[路飞]_leetcode-636-函数的独占时间 - 掘金](/ripro/timthumb.php?src=https://img.wangzhan5u.com/img/20211125/[lf]_rj305yatcu3.jpg&h=200&w=300&zc=1&a=c&q=100&s=1) 
        
       
        
       
    
发表评论
还没有评论,快来抢沙发吧!