comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
中等 |
|
给你一个下标从 0 开始的字符串 s
,只包含小写英文字母和一个整数 count
。如果 s
的 子串 中的每种字母在子串中恰好出现 count
次,这个子串就被称为 等计数子串。
返回 s
中 等计数子串 的个数。
子串 是字符串中连续的非空字符序列。
示例 1:
输入: s = "aaabcbbcc", count = 3 输出: 3 解释: 从下标 0 开始到下标 2 结束的子串是 "aaa"。 字母 “a” 在子串中恰好出现了 3 次。 从下标 3 开始到下标 8 结束的子串是 "bcbbcc"。 字母 “b” 和 “c” 在子串中恰好出现了 3 次。 从下标 0 开始到下标 8 结束的子串是 "aaabcbbcc"。 字母 “a”、“b” 和 “c” 在子串中恰好出现了 3 次。
示例 2:
输入: s = "abcd", count = 2 输出: 0 解释: 每种字母在 s 中出现的次数小于 count。 因此,s 中没有子串是等计数子串,返回 0。
示例 3:
输入: s = "a", count = 5 输出: 0 解释: 每种字母在 s 中出现的次数小于 count。 因此,s 中没有子串是等计数子串,返回 0。
提示:
1 <= s.length <= 3 * 104
1 <= count <= 3 * 104
s
只由小写英文字母组成。
我们可以在
接下来,我们将当前子串长度作为窗口的大小,统计窗口大小中有多少种字母的个数为
时间复杂度
class Solution:
def equalCountSubstrings(self, s: str, count: int) -> int:
ans = 0
for i in range(1, 27):
k = i * count
if k > len(s):
break
cnt = Counter()
t = 0
for j, c in enumerate(s):
cnt[c] += 1
t += cnt[c] == count
t -= cnt[c] == count + 1
if j >= k:
cnt[s[j - k]] -= 1
t += cnt[s[j - k]] == count
t -= cnt[s[j - k]] == count - 1
ans += i == t
return ans
class Solution {
public int equalCountSubstrings(String s, int count) {
int ans = 0;
int[] cnt = new int[26];
int n = s.length();
for (int i = 1; i < 27 && i * count <= n; ++i) {
int k = i * count;
Arrays.fill(cnt, 0);
int t = 0;
for (int j = 0; j < n; ++j) {
int a = s.charAt(j) - 'a';
++cnt[a];
t += cnt[a] == count ? 1 : 0;
t -= cnt[a] == count + 1 ? 1 : 0;
if (j - k >= 0) {
int b = s.charAt(j - k) - 'a';
--cnt[b];
t += cnt[b] == count ? 1 : 0;
t -= cnt[b] == count - 1 ? 1 : 0;
}
ans += i == t ? 1 : 0;
}
}
return ans;
}
}
class Solution {
public:
int equalCountSubstrings(string s, int count) {
int ans = 0;
int n = s.size();
int cnt[26];
for (int i = 1; i < 27 && i * count <= n; ++i) {
int k = i * count;
memset(cnt, 0, sizeof(cnt));
int t = 0;
for (int j = 0; j < n; ++j) {
int a = s[j] - 'a';
t += ++cnt[a] == count;
t -= cnt[a] == count + 1;
if (j >= k) {
int b = s[j - k] - 'a';
t += --cnt[b] == count;
t -= cnt[b] == count - 1;
}
ans += i == t;
}
}
return ans;
}
};
func equalCountSubstrings(s string, count int) (ans int) {
n := len(s)
for i := 1; i < 27 && i*count <= n; i++ {
k := i * count
cnt := [26]int{}
t := 0
for j, c := range s {
a := c - 'a'
cnt[a]++
if cnt[a] == count {
t++
} else if cnt[a] == count+1 {
t--
}
if j >= k {
b := s[j-k] - 'a'
cnt[b]--
if cnt[b] == count {
t++
} else if cnt[b] == count-1 {
t--
}
}
if i == t {
ans++
}
}
}
return
}
function equalCountSubstrings(s: string, count: number): number {
const n = s.length;
let ans = 0;
for (let i = 1; i < 27 && i * count <= n; ++i) {
const k = i * count;
const cnt: number[] = Array(26).fill(0);
let t = 0;
for (let j = 0; j < n; ++j) {
const a = s.charCodeAt(j) - 97;
t += ++cnt[a] === count ? 1 : 0;
t -= cnt[a] === count + 1 ? 1 : 0;
if (j >= k) {
const b = s.charCodeAt(j - k) - 97;
t += --cnt[b] === count ? 1 : 0;
t -= cnt[b] === count - 1 ? 1 : 0;
}
ans += i === t ? 1 : 0;
}
}
return ans;
}
/**
* @param {string} s
* @param {number} count
* @return {number}
*/
var equalCountSubstrings = function (s, count) {
const n = s.length;
let ans = 0;
for (let i = 1; i < 27 && i * count <= n; ++i) {
const k = i * count;
const cnt = Array(26).fill(0);
let t = 0;
for (let j = 0; j < n; ++j) {
const a = s.charCodeAt(j) - 97;
t += ++cnt[a] === count ? 1 : 0;
t -= cnt[a] === count + 1 ? 1 : 0;
if (j >= k) {
const b = s.charCodeAt(j - k) - 97;
t += --cnt[b] === count ? 1 : 0;
t -= cnt[b] === count - 1 ? 1 : 0;
}
ans += i === t ? 1 : 0;
}
}
return ans;
};