LeetCode-in-Java

3398. Smallest Substring With Identical Characters I

Hard

You are given a binary string s of length n and an integer numOps.

You are allowed to perform the following operation on s at most numOps times:

You need to minimize the length of the longest substring of s such that all the characters in the substring are identical.

Return the minimum length after the operations.

Example 1:

Input: s = “000001”, numOps = 1

Output: 2

Explanation:

By changing s[2] to '1', s becomes "001001". The longest substrings with identical characters are s[0..1] and s[3..4].

Example 2:

Input: s = “0000”, numOps = 2

Output: 1

Explanation:

By changing s[0] and s[2] to '1', s becomes "1010".

Example 3:

Input: s = “0101”, numOps = 0

Output: 1

Constraints:

Solution

public class Solution {
    public int minLength(String s, int ops) {
        char[] arr2 = s.toCharArray();
        int q = '0';
        int w = '1';
        int p1 = ops;
        int p2 = ops;
        for (int i = 0; i < s.length(); i++) {
            if (arr2[i] != q) {
                p1--;
            }
            if (arr2[i] != w) {
                p2--;
            }
            if (q == '0') {
                q = '1';
            } else {
                q = '0';
            }
            if (w == '0') {
                w = '1';
            } else {
                w = '0';
            }
        }
        if (p1 >= 0 || p2 >= 0) {
            return 1;
        }
        int low = 2;
        int high = s.length();
        int ans = 0;
        int n = s.length();
        while (low <= high) {
            int mid = (low + high) / 2;
            char[] arr = s.toCharArray();
            int p = ops;
            int c = 1;
            for (int i = 1; i < n; i++) {
                if (arr[i] == arr[i - 1]) {
                    c++;
                } else {
                    c = 1;
                }
                if (c > mid) {
                    if (arr[i - 1] == '0') {
                        arr[i - 1] = '1';
                    } else {
                        arr[i - 1] = '0';
                    }
                    p--;
                    c = 0;
                }
            }
            if (p < 0) {
                low = mid + 1;
            } else {
                ans = mid;
                high = mid - 1;
            }
        }
        return ans;
    }
}