Skip to content

Commit d0f01f5

Browse files
FindSubarrays added
1 parent 0de94d3 commit d0f01f5

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+
package videos;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class FindSubarrays {
7+
public static void main(String[] args) {
8+
}
9+
10+
public int numberOfSubarrays(final String a, final int p, final int q) {
11+
// System.out.println("MY TRY");
12+
final int length = a.length();
13+
final int[] sum = new int[length];
14+
getSums(a, length, sum);
15+
final int L = p + q;
16+
//count of possible combinations (diff, difference)
17+
final Map<Integer, Integer>[] count = new HashMap[L];
18+
int difference = 0;
19+
for (int i = 0; i < L; i++) {
20+
count[i] = new HashMap<>();
21+
}
22+
for (int i = 0; i < a.length(); i++) {//f[0]*q-f[1]*p = 0
23+
difference = difference + (a.charAt(i) == '0' ? p : -q);
24+
final int offset = i % L;
25+
count[offset].put(difference, count[offset].getOrDefault(difference, 0) + 1);
26+
}
27+
// System.out.println("SUMS: " + Arrays.toString(sum));
28+
// System.out.println("COUNTS: " + count);
29+
int total = 0;
30+
for (int i = 0; i < L; i++) {
31+
for (Map.Entry<Integer, Integer> entry : count[i].entrySet()) {
32+
int v = entry.getValue();
33+
if (entry.getKey() == 0 && i == L - 1) {
34+
v++;
35+
}
36+
total += (v * (v - 1)) / 2;
37+
// System.out.println("TOTAL: " + total + " " + i + " " + v);
38+
}
39+
}
40+
return total;
41+
}
42+
43+
public int bruteForce(final String a, final int p, final int q) {
44+
final int length = a.length();
45+
final int[] sum = new int[length];
46+
getSums(a, length, sum);
47+
final int L = p + q;
48+
int count = 0;
49+
for (int i = 0; i < length; i++) {
50+
for (int j = 1; i - j * L >= -1; j++) {
51+
final int end = i - j * L;
52+
if (end == -1) {
53+
if (sum[i] == p * j) {
54+
// System.out.println(0 + " " + i + " " + 0);
55+
count++;
56+
}
57+
} else if (sum[i] - sum[end] == p * j) {
58+
// System.out.println(((end + 1) % L) + " " + i + " " + (end + 1));
59+
count++;
60+
}
61+
}
62+
}
63+
return count;
64+
}
65+
66+
private void getSums(String a, int length, int[] sum) {
67+
sum[0] = a.charAt(0) - '0';
68+
for (int i = 1; i < length; i++) {
69+
sum[i] = sum[i - 1] + a.charAt(i) - '0';
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)