Skip to content

Commit ae7d047

Browse files
authored
Create 3261-count-substrings-that-satisfy-k-constraint-ii.js
1 parent 3bbddff commit ae7d047

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/**
2+
* @param {string} s
3+
* @param {number} k
4+
* @param {number[][]} queries
5+
* @return {number[]}
6+
*/
7+
var countKConstraintSubstrings = function(s, k, queries) {
8+
let binaryString = s, maxZerosOnes = k, queriesList = queries
9+
let length = binaryString.length;
10+
let zeroPrefixSum = Array(length + 1).fill(0);
11+
12+
for (let idx = 0; idx < length; idx++) {
13+
zeroPrefixSum[idx + 1] = (binaryString[idx] === '0' ? 1 : 0) + zeroPrefixSum[idx];
14+
}
15+
16+
let endIndex = Array(length).fill(0);
17+
18+
for (let start = 0; start < length; start++) {
19+
let end = start;
20+
let low = start, high = length - 1;
21+
22+
while (low <= high) {
23+
let mid = low + Math.floor((high - low) / 2);
24+
let zeroCount = zeroPrefixSum[mid + 1] - zeroPrefixSum[start];
25+
let oneCount = mid + 1 - start - zeroCount;
26+
27+
if (zeroCount <= maxZerosOnes || oneCount <= maxZerosOnes) {
28+
end = mid;
29+
low = mid + 1;
30+
} else {
31+
high = mid - 1;
32+
}
33+
}
34+
endIndex[start] = end;
35+
}
36+
37+
for (let i = 0; i < length; i++) {
38+
zeroPrefixSum[i + 1] = (endIndex[i] - i + 1) + zeroPrefixSum[i];
39+
}
40+
41+
let results = [];
42+
43+
/* Template by Bharadwaj ( LEETCODE JAVASCRIPT ) */
44+
/* Youtube : https://youtube.com/@code-with-Bharadwaj */
45+
/* Portfolio : https://manu-bharadwaj-portfolio.vercel.app/ */
46+
47+
for (let query of queriesList) {
48+
let left = query[0];
49+
let right = query[1];
50+
let validIndex = left - 1;
51+
let low = left, high = right;
52+
let totalCount = 0;
53+
54+
while (low <= high) {
55+
let mid = low + Math.floor((high - low) / 2);
56+
57+
if (endIndex[mid] < right) {
58+
validIndex = mid;
59+
low = mid + 1;
60+
} else {
61+
high = mid - 1;
62+
}
63+
}
64+
65+
totalCount += zeroPrefixSum[validIndex + 1] - zeroPrefixSum[left];
66+
let difference = right - validIndex;
67+
totalCount += (difference * (difference + 1)) / 2;
68+
results.push(totalCount);
69+
}
70+
71+
return results;
72+
};

0 commit comments

Comments
 (0)