<p>You are given a string <code>word</code> and an integer <code>k</code>.</p>

<p>A substring <code>s</code> of <code>word</code> is <strong>complete</strong> if:</p>

<ul>
	<li>Each character in <code>s</code> occurs <strong>exactly</strong> <code>k</code> times.</li>
	<li>The difference between two adjacent characters is <strong>at most</strong> <code>2</code>. That is, for any two adjacent characters <code>c1</code> and <code>c2</code> in <code>s</code>, the absolute difference in their positions in the alphabet is <strong>at most</strong> <code>2</code>.</li>
</ul>

<p>Return <em>the number of <strong>complete </strong>substrings of</em> <code>word</code>.</p>

<p>A <strong>substring</strong> is a <strong>non-empty</strong> contiguous sequence of characters in a string.</p>

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

<pre>
<strong>Input:</strong> word = &quot;igigee&quot;, k = 2
<strong>Output:</strong> 3
<strong>Explanation:</strong> The complete substrings where each character appears exactly twice and the difference between adjacent characters is at most 2 are: <u><strong>igig</strong></u>ee, igig<u><strong>ee</strong></u>, <u><strong>igigee</strong></u>.
</pre>

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

<pre>
<strong>Input:</strong> word = &quot;aaabbbccc&quot;, k = 3
<strong>Output:</strong> 6
<strong>Explanation:</strong> The complete substrings where each character appears exactly three times and the difference between adjacent characters is at most 2 are: <strong><u>aaa</u></strong>bbbccc, aaa<u><strong>bbb</strong></u>ccc, aaabbb<u><strong>ccc</strong></u>, <strong><u>aaabbb</u></strong>ccc, aaa<u><strong>bbbccc</strong></u>, <u><strong>aaabbbccc</strong></u>.
</pre>

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

<ul>
	<li><code>1 &lt;= word.length &lt;= 10<sup>5</sup></code></li>
	<li><code>word</code> consists only of lowercase English letters.</li>
	<li><code>1 &lt;= k &lt;= word.length</code></li>
</ul>

class Solution:
    def countCompleteSubstrings(self, w: str, k: int) -> int:
        output = 0
        for l in range(1, min(len(w) // k, 26) + 1):
            count = 0
            size = l * k
            letters = [0] * 26
            j = 0
            
            reset = False
            for i in range(len(w)):
                if i > 0 and abs(ord(w[i]) - ord(w[i - 1])) > 2:
                    j = i
                    count = 0
                    reset = True
                if reset:
                    reset = False
                    letters = [0] * 26
                letters[ord(w[i]) - ord("a")] += 1
                reps = letters[ord(w[i]) - ord("a")]
                if reps == k:
                    count += 1
                elif reps == k + 1:
                    count -= 1
                
                if i - j + 1 == size or i - j == size:
                    if i - j == size:
                        letters[ord(w[j]) - ord("a")] -= 1
                        reps = letters[ord(w[j]) - ord("a")]
                        if reps == k:
                            count += 1
                        elif reps == k - 1:
                            count -= 1
                        j += 1
                    output += count == l
        return output
                    


        # res = 0
        # for chars in range(1, min(len(w) // k, 26) + 1):
        #     exact, sz, cnt = 0, chars * k, [0] * 26
        #     dirty = False
        #     j = 0
        #     for i in range(len(w)):
        #         if i and abs(ord(w[i]) - ord(w[i - 1])) > 2:
        #             exact = 0
        #             dirty = True
        #             j = i
        #         if dirty:
        #             dirty = False
        #             cnt = [0] * 26
        #         cnt[ord(w[i])- ord('a')] += 1
        #         reps = cnt[ord(w[i]) - ord('a')]
        #         exact += 1 if reps == k else -1 if reps == k + 1 else 0
        #         if i - j + 1 >= sz:
        #             if i - j == sz:
        #                 cnt[ord(w[j]) - ord('a')] -= 1
        #                 reps = cnt[ord(w[j]) - ord('a')]
        #                 exact += 1 if reps == k else -1 if reps == k - 1 else 0
        #                 j += 1
        #             res += exact == chars
        # return res
4699