滑动窗口-求子数组的个数-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;
    }
}

posted @ 2025-03-16 22:06  Zero&&One  阅读(22)  评论(0)    收藏  举报