<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:
        # edge cases
        count = [[0] * 26]
        
        for letter in s:
            record = list(count[-1])
            record[ord(letter) - ord('a')] += 1
            count.append(record)
            
        #print(count)
        result = 0
        for length in range(minSize, maxSize + 1):
            note = {}
            for i in range(len(s)):
                if i + length - 1 >= len(s):
                    break
                    
                if self.unique_letter_count(count, i, i + length - 1) > maxLetters:
                    continue
                    
                substring = s[i : i + length]
                #print(substring)
                note[substring] = note.get(substring, 0) + 1
                
            if note:
                result = max(result, max(note.values()))
            
        return result
    
    def unique_letter_count(self, note: List[List[int]], left: int, right: int) -> int:
        #print(len(note), left, right)
        return sum([(1 if note[right + 1][i] - note[left][i] > 0 else 0) for i in range(26)])
        
            
                    
        
60700