3325. 字符至少出现 K 次的子字符串 I
题目链接:https://leetcode.cn/problems/count-substrings-with-k-frequency-characters-i/
代码
ts
/**
* 3325. 字符至少出现 K 次的子字符串 I
* https://leetcode.cn/problems/count-substrings-with-k-frequency-characters-i/
*/
function numberOfSubstrings(s: string, k: number): number {
let left = 0;
let res = 0;
const map = new Map<string, number>();
for (let i = 0; i < s.length; i++) {
map.set(s[i], (map.get(s[i]) || 0) + 1);
while (map.get(s[i])! >= k) {
if (map.get(s[left]) === 1) {
map.delete(s[left]);
} else {
map.set(s[left], map.get(s[left])! - 1);
}
left++;
}
res += left;
}
return res;
}思路
滑动窗口 + 哈希表统计字符出现次数:
使用哈希表
map记录窗口内每种字符的数量对于每个右端点
i:- 将
s[i]加入窗口,更新计数 - 当当前字符
s[i]的出现次数达到k次时,收缩左边界left,直到s[i]的出现次数小于k - 此时
left指向第一个不再满足条件的位置,以i为右端点的所有有效子字符串数量为left(即[0, i], [1, i], ..., [left-1, i]共left个)
- 将
累加所有右端点对应的子字符串数量
- 时间复杂度
,每个字符最多被访问两次(加入和移除窗口各一次) - 空间复杂度
,哈希表最多存储 26 种小写字母