重新分配字符使所有字符串都相等

102 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

题目描述

给你一个字符串数组 words(下标 从 0 开始 计数)。
在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。
如果执行任意步操作可以使 words 中的每个字符串都相等,返回 true ;否则,返回 false 。
来源:力扣(LeetCode)

  • 示例 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] 由小写英文字母组成

思路分析

这道题目其实不是很难,虽说题目写着是要移动某个字符串位置,然后判断所有字符串是否相等,但是我们不一定需要拿着每个字符串去一一地作对比。可以换个解决办法,一个字符串数组里面每个字符串都需要相等的话,那么每个字符串都需要有相同的字符,所以只要算好每个字符的总数,然后除以数组的长度,如果刚好能整除,那么就证明数组的每个字符串都是相同,也就是说移动某个字符串的字符移动到另外一个字符串中去,任意操作之后,绝对能使每个字符串都相同的。
使用map记录每个字符串总数,再去循环除以字符串数组长度,只要有一个不能整除,那么就return false,否则就return true.

AC代码

function solution( words ) {
    let maps = new Map()
    for( let strs of words) {
        let newArr = strs.split('');
        for(let item of newArr) {
            if(maps.has(item)) {
                maps.set(item, maps.get(item) + 1);
            } else {
                maps.set(item, 1);
            }
        }
    }
    let res = Array.from(maps.values());
    for(let item of res) {
        if(item % words.length !== 0) {
            console.log(false)
            return false;
        }
    }
    console.log(true)
    return true;
}
let words = ["abc","aabc","bc"];
solution( words );