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