1209. Remove All Adjacent Duplicates in String II
Description
You are given a string s and an integer k, a k duplicate removal consists of choosing k adjacent and equal letters from s and removing them, causing the left and the right side of the deleted substring to concatenate together.
We repeatedly make k duplicate removals on s until we no longer can.
Return the final string after all such duplicate removals have been made. It is guaranteed that the answer is unique.
Example 1:
Input: s = "abcd", k = 2 Output: "abcd" Explanation: There's nothing to delete.
Example 2:
Input: s = "deeedbbcccbdaa", k = 3 Output: "aa" Explanation: First delete "eee" and "ccc", get "ddbbbdaa" Then delete "bbb", get "dddaa" Finally delete "ddd", get "aa"
Example 3:
Input: s = "pbbcggttciiippooaais", k = 2 Output: "ps"
Constraints:
1 <= s.length <= 1052 <= k <= 104sonly contains lowercase English letters.
Solutions
Solution 1: Stack
Thinking
Repeatedly scanning and deleting \(k\) equal characters can rescan the string many times when \(n \le 10^5\). Deletion is local: only adjacent runs merge, and the two sides may meet again after a deletion.
A stack keeps surviving characters and their run lengths in left-to-right order. Matching the top increments the count; reaching \(k\) pops the run, i.e. one erasure.
We store \((char, count)\) and take the count modulo \(k\) so a full run pops immediately. After one pass the stack is the final string.
We can traverse the string \(s\), maintaining a stack that stores the characters and their occurrence counts. When traversing to character \(c\), if the character at the top of the stack is the same as \(c\), we increment the count of the top element by one; otherwise, we push the character \(c\) and count \(1\) into the stack. When the count of the top element equals \(k\), we pop the top element from the stack.
After traversing the string \(s\), the elements remaining in the stack form the final result. We can pop the elements from the stack one by one, concatenate them into a string, and that's our answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the string \(s\).
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |