1941-检查是否所有字符出现次数相同

Raphael Liu Lv10

给你一个字符串 s ,如果 s 是一个 字符串,请你返回 true ,否则请返回 false

如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 字符串。

示例 1:

**输入:** s = "abacbc"
**输出:** true
**解释:** s 中出现过的字符为 'a','b' 和 'c' 。s 中所有字符均出现 2 次。

示例 2:

**输入:** s = "aaabb"
**输出:** false
**解释:** s 中出现过的字符为 'a' 和 'b' 。
'a' 出现了 3 次,'b' 出现了 2 次,两者出现次数不同。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母。

方法一:统计每个字符的频数

思路与算法

首先,我们遍历字符串 s,并用哈希表 freq 统计每个字符的频数。随后,我们需要检查哈希表 freq 中每个字符的频数是否相等。

我们可以计算出满足要求时每个字符的理论频数 occ} = \textit{s.size}() / \textit{freq.size}(),并比较 freq 中每个字符的频数是否与 occ 相等。如果全部相等,那么说明符合要求,此时应返回 true 作为答案,反之亦然。

为了避免无法整除产生浮点数与整数的比较,我们可以在计算 occ 时用整除来代替除法,此时该判断方法依旧有效。

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
bool areOccurrencesEqual(string s) {
unordered_map<char, int> freq; // 每个字符的实际频数
for (const char ch : s){
if (!freq.count(ch)){
freq[ch] = 0;
}
++freq[ch];
}
int occ = s.size() / freq.size(); // 每个字符的理论频数
for (auto&& [_, v] : freq){
if (v != occ){
return false;
}
}
return true;
}
};
[sol1-Python3]
1
2
3
4
5
6
7
from collections import Counter

class Solution:
def areOccurrencesEqual(self, s: str) -> bool:
freq = Counter(s) # 每个字符的实际频数
occ = len(s) // len(freq) # 每个字符的理论频数
return all(v == occ for v in freq.values())

复杂度分析

  • 时间复杂度:O(n + |\Sigma|),其中 n 为 s 的长度,|\Sigma| 为字符集的大小。遍历 s 生成字符频数哈希表的时间复杂度为 O(n),遍历所有频数判断是否相等的时间复杂度为 O(|\Sigma|)。

  • 空间复杂度:O(|\Sigma|),即为字符频数哈希表和频数哈希集合的空间复杂度。

 Comments
On this page
1941-检查是否所有字符出现次数相同