滑动窗口-求子数组的个数-1358. 包含所有三种字符的子字符串数目

解题思路
从小到大枚举子串右端点 right,同时用哈希表/数组统计每种字母的出现次数。如果子串符合要求(三种字母都至少出现一次),则右移左端点 left,直到不符合要求为止。
滑动窗口的内层循环结束时,右端点固定在 right,左端点在 0,1,2,…,left−1 的所有子串都是合法的,这一共有 left 个,加入答案。
在算法中,ans += left; 的作用是统计当前右指针位置 right 对应的有效子串数目。具体来说,当调整左指针 left 后,所有以 left 为界限的左侧起始位置(即从初始左指针到当前 left 的前一个位置)与当前右指针组成的子串均满足包含所有三种字符(a、b、c)的条件。此时,left 的值恰好表示这些有效子串的数量。
class Solution {
public int numberOfSubstrings(String S) {
char[] s = S.toCharArray();
int ans = 0;
int left = 0;
int[] cnt = new int[3];
for (char c : s) {
cnt[c - 'a']++;
while (cnt[0] > 0 && cnt[1] > 0 && cnt[2] > 0) {
cnt[s[left] - 'a']--;
left++;
}
ans += left;
}
return ans;
}
}
坚冰还盖着北海的时候,我看到了怒放的梅花。

浙公网安备 33010602011771号