CCCPaste

LC weekly Contest 470 Q3

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;
        }
    }
}