Welcome to Subscribe On Youtube

3261. Count Substrings That Satisfy K-Constraint II

Description

You are given a binary string s and an integer k.

You are also given a 2D integer array queries, where queries[i] = [li, ri].

A binary string satisfies the k-constraint if either of the following conditions holds:

  • The number of 0's in the string is at most k.
  • The number of 1's in the string is at most k.

Return an integer array answer, where answer[i] is the number of substrings of s[li..ri] that satisfy the k-constraint.

 

Example 1:

Input: s = "0001111", k = 2, queries = [[0,6]]

Output: [26]

Explanation:

For the query [0, 6], all substrings of s[0..6] = "0001111" satisfy the k-constraint except for the substrings s[0..5] = "000111" and s[0..6] = "0001111".

Example 2:

Input: s = "010101", k = 1, queries = [[0,5],[1,4],[2,3]]

Output: [15,9,3]

Explanation:

The substrings of s with a length greater than 3 do not satisfy the k-constraint.

 

Constraints:

  • 1 <= s.length <= 105
  • s[i] is either '0' or '1'.
  • 1 <= k <= s.length
  • 1 <= queries.length <= 105
  • queries[i] == [li, ri]
  • 0 <= li <= ri < s.length
  • All queries are distinct.

Solutions

Solution 1

  • class Solution {
        public long[] countKConstraintSubstrings(String s, int k, int[][] queries) {
            int[] cnt = new int[2];
            int n = s.length();
            int[] d = new int[n];
            Arrays.fill(d, n);
            long[] pre = new long[n + 1];
            for (int i = 0, j = 0; j < n; ++j) {
                cnt[s.charAt(j) - '0']++;
                while (cnt[0] > k && cnt[1] > k) {
                    d[i] = j;
                    cnt[s.charAt(i++) - '0']--;
                }
                pre[j + 1] = pre[j] + j - i + 1;
            }
            int m = queries.length;
            long[] ans = new long[m];
            for (int i = 0; i < m; ++i) {
                int l = queries[i][0], r = queries[i][1];
                int p = Math.min(r + 1, d[l]);
                long a = (1L + p - l) * (p - l) / 2;
                long b = pre[r + 1] - pre[p];
                ans[i] = a + b;
            }
            return ans;
        }
    }
    
    
  • class Solution {
    public:
        vector<long long> countKConstraintSubstrings(string s, int k, vector<vector<int>>& queries) {
            int cnt[2]{};
            int n = s.size();
            vector<int> d(n, n);
            long long pre[n + 1];
            pre[0] = 0;
            for (int i = 0, j = 0; j < n; ++j) {
                cnt[s[j] - '0']++;
                while (cnt[0] > k && cnt[1] > k) {
                    d[i] = j;
                    cnt[s[i++] - '0']--;
                }
                pre[j + 1] = pre[j] + j - i + 1;
            }
            vector<long long> ans;
            for (const auto& q : queries) {
                int l = q[0], r = q[1];
                int p = min(r + 1, d[l]);
                long long a = (1LL + p - l) * (p - l) / 2;
                long long b = pre[r + 1] - pre[p];
                ans.push_back(a + b);
            }
            return ans;
        }
    };
    
    
  • class Solution:
        def countKConstraintSubstrings(
            self, s: str, k: int, queries: List[List[int]]
        ) -> List[int]:
            cnt = [0, 0]
            i, n = 0, len(s)
            d = [n] * n
            pre = [0] * (n + 1)
            for j, x in enumerate(map(int, s)):
                cnt[x] += 1
                while cnt[0] > k and cnt[1] > k:
                    d[i] = j
                    cnt[int(s[i])] -= 1
                    i += 1
                pre[j + 1] = pre[j] + j - i + 1
            ans = []
            for l, r in queries:
                p = min(r + 1, d[l])
                a = (1 + p - l) * (p - l) // 2
                b = pre[r + 1] - pre[p]
                ans.append(a + b)
            return ans
    
    
  • func countKConstraintSubstrings(s string, k int, queries [][]int) (ans []int64) {
    	cnt := [2]int{}
    	n := len(s)
    	d := make([]int, n)
    	for i := range d {
    		d[i] = n
    	}
    	pre := make([]int, n+1)
    	for i, j := 0, 0; j < n; j++ {
    		cnt[s[j]-'0']++
    		for cnt[0] > k && cnt[1] > k {
    			d[i] = j
    			cnt[s[i]-'0']--
    			i++
    		}
    		pre[j+1] = pre[j] + j - i + 1
    	}
    	for _, q := range queries {
    		l, r := q[0], q[1]
    		p := min(r+1, d[l])
    		a := (1 + p - l) * (p - l) / 2
    		b := pre[r+1] - pre[p]
    		ans = append(ans, int64(a+b))
    	}
    	return
    }
    
    
  • function countKConstraintSubstrings(s: string, k: number, queries: number[][]): number[] {
        const cnt: [number, number] = [0, 0];
        const n = s.length;
        const d: number[] = Array(n).fill(n);
        const pre: number[] = Array(n + 1).fill(0);
        for (let i = 0, j = 0; j < n; ++j) {
            cnt[+s[j]]++;
            while (Math.min(cnt[0], cnt[1]) > k) {
                d[i] = j;
                cnt[+s[i++]]--;
            }
            pre[j + 1] = pre[j] + j - i + 1;
        }
        const ans: number[] = [];
        for (const [l, r] of queries) {
            const p = Math.min(r + 1, d[l]);
            const a = ((1 + p - l) * (p - l)) / 2;
            const b = pre[r + 1] - pre[p];
            ans.push(a + b);
        }
        return ans;
    }
    
    

All Problems

All Solutions