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.
思路:用stack做,node里面存char和fre;然后遇见不同的push,相同的记录fre+1,然后==k, 就pop;最后倒序输出;
class Solution {
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<>();
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++;
if(stack.peek().fre == k) {
stack.pop();
}
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
Node node = stack.pop();
int step = node.fre;
while(step > 0) {
sb.insert(0, node.c);
step--;
}
}
return sb.toString();
}
}