# [2-Pointers-Sliding-Window]
# https://leetcode.com/problems/substrings-of-size-three-with-distinct-characters/
# 1876. Substrings of Size Three with Distinct Characters

# History:
# 1.
# Jul 18, 2021

# A string is good if there are no repeated characters.
#
# Given a string s, return the number of good substrings of length three in s.
#
# Note that if there are multiple occurrences of the same substring, every occurrence should be counted.
#
# A substring is a contiguous sequence of characters in a string.
#
#
#
# Example 1:
#
# Input: s = "xyzzaz"
# Output: 1
# Explanation: There are 4 substrings of size 3: "xyz", "yzz", "zza", and "zaz".
# The only good substring of length 3 is "xyz".
# Example 2:
#
# Input: s = "aababcabc"
# Output: 4
# Explanation: There are 7 substrings of size 3: "aab", "aba", "bab", "abc", "bca", "cab", and "abc".
# The good substrings are "abc", "bca", "cab", and "abc".
#
#
# Constraints:
#
# 1 <= s.length <= 100
# s consists of lowercase English letters.

from collections import defaultdict


class Solution(object):
    def countGoodSubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        counter = defaultdict(int)
        ones_count = 0
        ret = 0

        for i in range(len(s)):
            c = s[i]
            counter[c] += 1
            if counter[c] == 1:
                ones_count += 1
            elif counter[c] == 2:
                ones_count -= 1
            if i >= 3:
                pre_c = s[i - 3]
                counter[pre_c] -= 1
                if counter[pre_c] == 1:
                    ones_count += 1
                elif counter[pre_c] == 0:
                    ones_count -= 1

            if ones_count == 3:
                ret += 1

        return ret
