class Solution {
public String removeSubstring(String s, int k) {
q3 res = new q3();
return res.solve(s, k);
}
}
class q3 {
public String solve(String s, int k) {
ArrayDeque deque = new ArrayDeque<>();
for (char c : s.toCharArray()) {
if (!deque.isEmpty() && deque.peekLast().c == c) {
deque.peekLast().cnt++;
} else {
deque.addLast(new Run(c, 1));
}
while (deque.size() >= 2) {
Run last = deque.pollLast();
Run pre = deque.peekLast();
if (last.c != ')' || last.cnt < k || pre.c != '(' || pre.cnt < k) {
deque.addLast(last);
break;
}
last.cnt -= k;
if (last.cnt > 0) {
deque.addLast(last);
}
deque.pollLast();
pre.cnt -= k;
if (pre.cnt > 0) {
deque.addLast(pre);
}
}
}
StringBuilder sb = new StringBuilder();
for (Run r : deque) {
for (int i = 0; i < r.cnt; i++) {
sb.append(r.c);
}
}
// System.out.println("L="+k);
// System.out.println("count="+sb.length());
return sb.toString();
}
static class Run {
char c;
int cnt;
Run(char cc, int ccnt) {
c = cc;
cnt = ccnt;
}
}
}