LeetCode-in-Java

3777. Minimum Deletions to Make Alternating Substring

Hard

You are given a string s of length n consisting only of the characters 'A' and 'B'.

You are also given a 2D integer array queries of length q, where each queries[i] is one of the following:

A substring is alternating if no two adjacent characters are equal. A substring of length 1 is always alternating.

Return an integer array answer, where answer[i] is the result of the ith query of type [2, l, r].

Example 1:

Input: s = “ABA”, queries = [[2,1,2],[1,1],[2,0,2]]

Output: [0,2]

Explanation:

i queries[i] j l r s before query s[l..r] Result Answer
0 [2, 1, 2] - 1 2 "ABA" "BA" Already alternating 0
1 [1, 1] 1 - - "ABA" - Flip s[1] from 'B' to 'A' -
2 [2, 0, 2] - 0 2 "AAA" "AAA" Delete any two 'A's to get "A" 2

Thus, the answer is [0, 2].

Example 2:

Input: s = “ABB”, queries = [[2,0,2],[1,2],[2,0,2]]

Output: [1,0]

Explanation:

i queries[i] j l r s before query s[l..r] Result Answer
0 [2, 0, 2] - 0 2 "ABB" "ABB" Delete one 'B' to get "AB" 1
1 [1, 2] 2 - - "ABB" - Flip s[2] from 'B' to 'A' -
2 [2, 0, 2] - 0 2 "ABA" "ABA" Already alternating 0

Thus, the answer is [1, 0].

Example 3:

Input: s = “BABA”, queries = [[2,0,3],[1,1],[2,1,3]]

Output: [0,1]

Explanation:

i queries[i] j l r s before query s[l..r] Result Answer
0 [2, 0, 3] - 0 3 "BABA" "BABA" Already alternating 0
1 [1, 1] 1 - - "BABA" - Flip s[1] from 'A' to 'B' -
2 [2, 1, 3] - 1 3 "BBBA" "BBA" Delete one 'B' to get "BA" 1

Thus, the answer is [0, 1].

Constraints:

Solution

import java.util.Arrays;

public class Solution {
    private int[] f;
    private int n;

    private void add(int i, int v) {
        for (i++; i <= n; i += i & -i) {
            f[i] += v;
        }
    }

    private int sum(int i) {
        int s = 0;
        for (i++; i > 0; i -= i & -i) {
            s += f[i];
        }
        return s;
    }

    public int[] minDeletions(String s, int[][] q) {
        char[] a = s.toCharArray();
        n = a.length;
        f = new int[n + 1];
        for (int i = 0; i + 1 < n; i++) {
            if (a[i] == a[i + 1]) {
                add(i, 1);
            }
        }
        int[] ans = new int[q.length];
        int k = 0;
        for (int[] e : q) {
            if (e[0] == 1) {
                int j = e[1];
                if (j > 0 && a[j] == a[j - 1]) {
                    add(j - 1, -1);
                }
                if (j + 1 < n && a[j] == a[j + 1]) {
                    add(j, -1);
                }
                a[j] = a[j] == 'A' ? 'B' : 'A';
                if (j > 0 && a[j] == a[j - 1]) {
                    add(j - 1, 1);
                }
                if (j + 1 < n && a[j] == a[j + 1]) {
                    add(j, 1);
                }
            } else {
                int l = e[1];
                int r = e[2];
                ans[k++] = l < r ? sum(r - 1) - sum(l - 1) : 0;
            }
        }
        return Arrays.copyOf(ans, k);
    }
}