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

243 阅读2分钟

image.png

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

题目地址:leetcode-cn.com/problems/ch…

给定两个字符串 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返回这个对象键值对的数组 image.png
  • 数组的sort方法如果参数不传,则使用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
    • 字符串情况

image.png

  • 数字情况

image.png

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

说明

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

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