【Leetcode 1897 】重新分配字符使所有字符串都相等 —— 数组模拟哈希表

79 阅读1分钟

给你一个字符串数组 words(下标 从 0 开始 计数)。

在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。

如果执行任意步操作可以使 words 中的每个字符串都相等,返回 true **;否则,返回 **false 。

示例 1:

输入: words = ["abc","aabc","bc"]
输出: true
解释: 将 words[1] 中的第一个 'a' 移动到 words[2] 的最前面。
使 words[1] = "abc" 且 words[2] = "abc" 。
所有字符串都等于 "abc" ,所以返回 true

示例 2:

输入: words = ["ab","a"]
输出: false
解释: 执行操作无法使所有字符串都相等。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i] 由小写英文字母组成

数组模拟哈希表

/*
https://leetcode.cn/u/cshappyeveryday/
执行用时:76 ms, 在所有 Typescript 提交中击败了100.00%的用户
内存消耗:52.82 MB, 在所有 Typescript 提交中击败了100.00%的用户
2024年8月24日 
*/
function makeEqual(words: string[]): boolean {
  const n = words.length;
  const arr = new Array(26).fill(0);
  const OFFSET = "a".charCodeAt(0);
  //记录每个字符出现的次数
  for (const word of words) {
    for (const char of word) {
      arr[char.charCodeAt(0) - OFFSET] += 1;
    }
  }
  //若数组元素为n个,则要保存每个元素都一样,则必须字符出现次数能被n整除
  for (let i = 0; i < 26; i++) {
    if (arr[i] % n !== 0) return false;
  }
  return true;
}