Number of Substrings Containing All Three Characters

medium sliding window counting

Problem

You are given a string s built only from the letters a, b and c (3 ≤ |s| ≤ 5·10⁴). Count how many substrings of s contain at least one a, at least one b and at least one c.

With up to ~1.25 billion substrings possible, checking each one is far too slow — a sliding window counts them all in a single pass.

Inputs = "abcabc"
Output10
The valid substrings are "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc" and the second "abc".

def number_of_substrings(s):
    count = {'a': 0, 'b': 0, 'c': 0}
    left = 0
    ans = 0
    for right, ch in enumerate(s):
        count[ch] += 1
        while count['a'] > 0 and count['b'] > 0 and count['c'] > 0:
            count[s[left]] -= 1
            left += 1
        ans += left
    return ans
function numberOfSubstrings(s) {
  const count = { a: 0, b: 0, c: 0 };
  let left = 0, ans = 0;
  for (let right = 0; right < s.length; right++) {
    count[s[right]]++;
    while (count.a > 0 && count.b > 0 && count.c > 0) {
      count[s[left]]--;
      left++;
    }
    ans += left;
  }
  return ans;
}
int numberOfSubstrings(String s) {
    int[] count = new int[3];
    int left = 0, ans = 0;
    for (int right = 0; right < s.length(); right++) {
        count[s.charAt(right) - 'a']++;
        while (count[0] > 0 && count[1] > 0 && count[2] > 0) {
            count[s.charAt(left) - 'a']--;
            left++;
        }
        ans += left;
    }
    return ans;
}
int numberOfSubstrings(string s) {
    int count[3] = {0, 0, 0};
    int left = 0, ans = 0;
    for (int right = 0; right < (int)s.size(); right++) {
        count[s[right] - 'a']++;
        while (count[0] > 0 && count[1] > 0 && count[2] > 0) {
            count[s[left] - 'a']--;
            left++;
        }
        ans += left;
    }
    return ans;
}
Time: O(n) Space: O(1)