LeetCode算法:判定是否互为字符重排

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 2 天,点击查看活动详情

判定是否互为字符重排

原题地址

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

示例 1:

输入: s1 = "abc", s2 = "bca"
输出: true 

示例 2:

输入: s1 = "abc", s2 = "bad"
输出: false

说明:

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

思路分析

方法一

  1. 分析题目,可以得知两个字符串中含有的字符肯定是相同的;那么,它们排序后「不管是升序还是降序排列」得到的字符串一定是相同的;
  2. 将两个字符串排序,本方法采用的是先将字符串转换成数组,使用 sort() 方法进行排序后,再使用 join() 方法转换成字符串;
  3. 判断步骤二得到的两个字符串是否相同即可。

方法二

  1. 如果两个字符串的长度不相同,那么返回值一定是 false
  2. 两个字符串的长度相同时,若要满足题目条件,那么两个字符串中每个字符出现的次数肯定是相同的;
  3. 定义 map1map2 来存储两个字符串中每个字符出现的次数,遍历两个字符串得到 map1map2 的结果;
  4. map1 或者 map2key 做遍历,判断 map1map2 中每个 key 对应的 value 值是否相同。

AC 代码

方法一

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var CheckPermutation = function(s1, s2) {
    return s1.split('').sort().join() === s2.split('').sort().join()
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了13.90%的用户
  • 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了43.87%的用户
  • 通过测试用例:23 / 23

方法二

/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var CheckPermutation = function(s1, s2) {
    if(s1.length !== s2.length) return false
    const map1 = {}
    const map2 = {}
    for(let i = 0; i < s1.length; i++) {
        if(map1[s1[i]]) {
            map1[s1[i]] += 1
        } else {
            map1[s1[i]] = 1
        }
    }
    for(let i = 0; i < s2.length; i++) {
        if(map2[s2[i]]) {
            map2[s2[i]] += 1
        } else {
            map2[s2[i]] = 1
        }
    }
   return Object.keys(map1).every((key) => map1[key] === map2[key])
};

结果:

  • 执行结果: 通过
  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了7.36%的用户
  • 内存消耗:41.3 MB, 在所有 JavaScript 提交中击败了5.18%的用户
  • 通过测试用例:23 / 23

END