<p>Given a string <code>s</code>, return the maximum number of occurrences of <strong>any</strong> substring under the following rules:</p>

<ul>
	<li>The number of unique characters in the substring must be less than or equal to <code>maxLetters</code>.</li>
	<li>The substring size must be between <code>minSize</code> and <code>maxSize</code> inclusive.</li>
</ul>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;aababcaab&quot;, maxLetters = 2, minSize = 3, maxSize = 4
<strong>Output:</strong> 2
<strong>Explanation:</strong> Substring &quot;aab&quot; has 2 occurrences in the original string.
It satisfies the conditions, 2 unique letters and size 3 (between minSize and maxSize).
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;aaaa&quot;, maxLetters = 1, minSize = 3, maxSize = 3
<strong>Output:</strong> 2
<strong>Explanation:</strong> Substring &quot;aaa&quot; occur 2 times in the string. It can overlap.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= maxLetters &lt;= 26</code></li>
	<li><code>1 &lt;= minSize &lt;= maxSize &lt;= min(26, s.length)</code></li>
	<li><code>s</code> consists of only lowercase English letters.</li>
</ul>

class Solution:
    def maxFreq(self, s: str, maxLetters: int, minSize: int, maxSize: int) -> int:
        res=0
        n = len(s)
        def find(size):
            nonlocal maxLetters,n
            l,r=0,-1
            d= {}
            ans =Counter()
            deque = collections.deque()
            res = 0 
            while r<size-1:
                r+=1
                deque.append(s[r])
                d[s[r]]=d.get(s[r],0)+1
            while r<n:
                # print(l,r)
                if len(d)<=maxLetters:
                    ans[tuple(deque)]+=1
                    res+=1
                d[s[l]]-=1
                if d[s[l]]==0:
                    del d[s[l]]
                deque.popleft()
                if r+1<n:
                    d[s[r+1]]=d.get(s[r+1],0)+1
                    deque.append(s[r+1])
                l+=1
                r+=1
            # print(ans)
            # print(res,size,'size')
            if len(ans)==0:
                return 0
            return max(ans.values())
        for x in range(minSize,maxSize+1):
            res= max(res,find(x))
        return res
39100