检查两个字符串是否几乎相等

184 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

题目描述

如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。
给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。
一个字母 x 的出现 频率 指的是它在字符串中出现的次数。 来源:力扣(LeetCode)

  • 示例 1
输入:word1 = "aaaa", word2 = "bccb"
输出:false
解释:字符串 "aaaa" 中有 4'a' ,但是 "bccb" 中有 0'a' 。
两者之差为 4 ,大于上限 3
  • 示例 2
输入:word1 = "abcdeef", word2 = "abaaacc"
输出:true
解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
- 'a' 在 word1 中出现了 1 次,在 word2 中出现了 4 次,差为 3 。
- 'b' 在 word1 中出现了 1 次,在 word2 中出现了 1 次,差为 0 。
- 'c' 在 word1 中出现了 1 次,在 word2 中出现了 2 次,差为 1 。
- 'd' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。
- 'e' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。
- 'f' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1
  • 示例 3
输入:word1 = "cccddabba", word2 = "babababab"
输出:true
解释:word1 和 word2 中每个字母出现频率之差至多为 3 :
- 'a' 在 word1 中出现了 2 次,在 word2 中出现了 4 次,差为 2 。
- 'b' 在 word1 中出现了 2 次,在 word2 中出现了 5 次,差为 3 。
- 'c' 在 word1 中出现了 3 次,在 word2 中出现了 0 次,差为 3 。
- 'd' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2

思路分析

根据题意可知,题目给出两个字符串word1,word2,判断两个字符串是否是几乎相等。啥叫几乎相等呢?指的是两个字符串中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,那么就可以说这两个字符串几乎相等。
首先计算出两个字符串中每个字母在字符串中出现的次数,用Map对象存着,然后再循环两个Map对象,比对相同字符在两个字符串中出现次数的差值是否大于3;还有一种情况就是一个字符串中里面的字符出现的次数超过3次,并且另一个字符串没有这个字符,所以,这种就可以直接暂停,他就不是几乎相等了。

AC代码

function solution(word1, word2) {
    let map1 = new Map();
    let map2 = new Map();
    for(let i=0; i<word1.length; i++) {
        if(map1.has(word1[i])) {
            map1.set(word1[i], map1.get(word1[i]) + 1)
        }else{
            map1.set(word1[i], 1)
        }
        if(!word2.includes(word1[i]) && map1.get(word1[i]) > 3) {
            console.log(false);
            return false;
        }
    }
    for(let i=0; i<word2.length; i++) {
        if(map2.has(word2[i])) {
            map2.set(word2[i], map2.get(word2[i]) + 1)
        }else{
            map2.set(word2[i], 1)
        }
        if(!word1.includes(word2[i]) && map2.get(word2[i]) > 3) {
            console.log(false);
            return false;
        }
    }
    for(let [key, value] of map1) {
        for(let [i, val] of map2) {
            if(key === i && Math.abs(value - val) > 3) {
                console.log(false);
                 return false;
            }
        }
    }
    console.log(true)
    
};
let word1 = "aaaa", word2 = "bccb"
solution(word1, word2);