Given a string s
, 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 <= 10^5
2 <= k <= 10^4
s
only contains lower case English letters.
class Solution { public String removeDuplicates(String s, int k) { Stack<Integer> s2 = new Stack(); Stack<Character> s1 = new Stack(); for(char c : s.toCharArray()) { if(!s1.isEmpty() && s1.peek() == c) s2.push(s2.peek() + 1); else s2.push(1); s1.push(c); if(s2.peek() == k) { for(int i = 0; i < k; i++) { s1.pop(); s2.pop(); } } } StringBuilder sb = new StringBuilder(); while(!s1.isEmpty()) sb.append(s1.pop()); return sb.reverse().toString(); } }
妹想到 俩stack就能做出来了,一个存当前的char,另一个存当前c存在的长度,如果长度和k相等就一起开始pop。