Skip to content

Latest commit

 

History

History

2068.Check Whether Two Strings are Almost Equivalent

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

English Version

题目描述

如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。

给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。

一个字母 x 的出现 频率 指的是它在字符串中出现的次数。

 

示例 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 。

 

提示:

  • n == word1.length == word2.length
  • 1 <= n <= 100
  • word1 和 word2 都只包含小写英文字母。

解法

哈希表计数。

Python3

class Solution:
    def checkAlmostEquivalent(self, word1: str, word2: str) -> bool:
        counter = defaultdict(int)
        for c in word1:
            counter[c] += 1
        for c in word2:
            counter[c] -= 1
        return all(abs(x) <= 3 for x in counter.values())

Java

class Solution {
    public boolean checkAlmostEquivalent(String word1, String word2) {
        int[] counter = new int[26];
        for (char c : word1.toCharArray()) {
            ++counter[c - 'a'];
        }
        for (char c : word2.toCharArray()) {
            --counter[c - 'a'];
        }
        for (int i = 0; i < 26; ++i) {
            if (Math.abs(counter[i]) > 3) {
                return false;
            }
        }
        return true;
    }
}

C++

class Solution {
public:
    bool checkAlmostEquivalent(string word1, string word2) {
        vector<int> counter(26);
        for (char& c : word1) ++counter[c - 'a'];
        for (char& c : word2) --counter[c - 'a'];
        for (int i = 0; i < 26; ++i)
            if (abs(counter[i]) > 3)
                return 0;
        return 1;
    }
};

Go

func checkAlmostEquivalent(word1 string, word2 string) bool {
	counter := make([]int, 26)
	for i := range word1 {
		counter[word1[i]-'a']++
	}
	for i := range word2 {
		counter[word2[i]-'a']--
	}
	for _, v := range counter {
		if v > 3 || -v > 3 {
			return false
		}
	}
	return true
}

...