文章

02 判定是否互为字符重排

判定是否互为字符重排

题目描述

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

示例 1:

输入: s1 = “abc”, s2 = “bca” 输出: true

示例 2:

输入: s1 = “abc”, s2 = “bad” 输出: false

说明:

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

解法

  • 分别给 s1 和 s2 创建字典,记录每个字母的出现次数
  • 对比字典
    • 现对比两个字段的 keys 长度是否一致
    • 然后遍历一个字典的 keys,放在 s1 和 s2 的字典中取值进行对比,若完全一致则返回 true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function isLiklyStr(str1, str2) {
  const dict1 = {},
    dict2 = {};
  for (const i in str1) {
    const element = str1[i];
    if (!dict1[element]) dict1[element] = 1;
    if (dict1[element]) dict1[element]++;
  }
  for (const i in str2) {
    const element = str2[i];
    if (!dict2[element]) dict2[element] = 1;
    if (dict2[element]) dict2[element]++;
  }
  if (Object.keys(dict1).length !== Object.keys(dict2).length) return false;
  for (const key of Object.keys(dict1)) {
    if (dict1[key] !== dict2[key]) return false;
  }
  return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var CheckPermutation = function (s1, s2) {
  if (s1.length !== s2.length) return false;
  const dict1 = {},
    dict2 = {};
  for (const i in s1) {
    if (!dict1[s1[i]]) dict1[s1[i]] = 1;
    if (dict1[s1[i]]) dict1[s1[i]]++;
    if (!dict2[s2[i]]) dict2[s2[i]] = 1;
    if (dict2[s2[i]]) dict2[s2[i]]++;
  }
  for (const key of Object.keys(dict1)) {
    if (dict1[key] !== dict2[key]) return false;
  }
  return true;
};
本文由作者按照 CC BY 4.0 进行授权