class Solution:
    # main idea: if a string has appeared x times, then its substring at least appeares x times 
    # time O(KN)  space (KN)  where K is minSize 
    def maxFreq(self, s: str, maxLetters: int, minSize: int, maxSize: int) -> int:
        d = {}
        str_len = len(s)
        for i in range(str_len-minSize+1):
            word = s[i:i+minSize]
            if word in d:
                d[word] += 1
            else:
                if len(collections.Counter(word)) <= maxLetters:  # set() is faster
                    d[word] = 1            
        return max(d.values()) if d else 0