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.
思路:這題有個tricky的點就是:stack.peek()的count必須跟着當前的點,什麼意思,就是bbyybb,你不能說b的count是4了,你就開始pop,不行,後面的b,count是2,而不是4. 這樣的話,就建立node,node包含char和fre,如果 == k, 直接pop這個node就可以了;
class Solution {
private class Node {
public char c;
public int fre;
public Node(char c, int fre) {
this.c = c;
this.fre = fre;
}
}
public String removeDuplicates(String s, int k) {
Stack<Node> stack = new Stack<Node>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(stack.isEmpty() || stack.peek().c != c) {
stack.push(new Node(c, 1));
} else {
stack.peek().fre += 1;
if(stack.peek().fre == k) {
stack.pop();
}
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
int fre = stack.peek().fre;
char c = stack.peek().c;
while(fre > 0) {
sb.insert(0, c);
fre--;
}
stack.pop();
}
return sb.toString();
}
}