<p>You are given a string <code>s</code> and an integer <code>k</code>, a <code>k</code> <strong>duplicate removal</strong> consists of choosing <code>k</code> adjacent and equal letters from <code>s</code> and removing them, causing the left and the right side of the deleted substring to concatenate together.</p>

<p>We repeatedly make <code>k</code> <strong>duplicate removals</strong> on <code>s</code> until we no longer can.</p>

<p>Return <em>the final string after all such duplicate removals have been made</em>. It is guaranteed that the answer is <strong>unique</strong>.</p>

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

<pre>
<strong>Input:</strong> s = &quot;abcd&quot;, k = 2
<strong>Output:</strong> &quot;abcd&quot;
<strong>Explanation: </strong>There&#39;s nothing to delete.</pre>

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

<pre>
<strong>Input:</strong> s = &quot;deeedbbcccbdaa&quot;, k = 3
<strong>Output:</strong> &quot;aa&quot;
<strong>Explanation: 
</strong>First delete &quot;eee&quot; and &quot;ccc&quot;, get &quot;ddbbbdaa&quot;
Then delete &quot;bbb&quot;, get &quot;dddaa&quot;
Finally delete &quot;ddd&quot;, get &quot;aa&quot;</pre>

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

<pre>
<strong>Input:</strong> s = &quot;pbbcggttciiippooaais&quot;, k = 2
<strong>Output:</strong> &quot;ps&quot;
</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>2 &lt;= k &lt;= 10<sup>4</sup></code></li>
	<li><code>s</code> only contains lowercase English letters.</li>
</ul>

class Solution:
    def removeDuplicates(self, s: str, k: int) -> str:
        stack = []  # d e 
        repeated = None
        count = 0

        for i, ch in enumerate(s + '2'):
            # repeating mode
            if count == k:
                repeated = None
                count = 0
                
            if repeated and repeated ==ch:
                count += 1
                continue
            
            # repeat ended
            if repeated:
                stack.extend([repeated] * count)
                repeated = None
                count = 0
        
            if stack and stack[-1] == ch:
                repeated = ch
                count = 1
                while stack and stack[-1] == ch:
                    stack.pop()
                    count += 1
            else:
                stack.append(ch)
        
        return ''.join(stack[:-1])


'''
repeatedly make k duplicate removals
ans is unique

stack --> put or pop out during iteration based on some rules

1. if this is repeated, pop out existing chars and then keep tracking
  1.1 until it reaches k, then diminish
  1.2 until it reaches next diff char, then add them in


'''
18500