Skip to content

Commit 7d2f2c9

Browse files
committed
Added tasks 3398, 3399
1 parent 7fe89f1 commit 7d2f2c9

File tree

6 files changed

+290
-0
lines changed

6 files changed

+290
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package g3301_3400.s3398_smallest_substring_with_identical_characters_i;
2+
3+
// #Hard #2024_12_24_Time_1_ms_(100.00%)_Space_42.9_MB_(39.83%)
4+
5+
public class Solution {
6+
public int minLength(String s, int ops) {
7+
char[] arr2 = s.toCharArray();
8+
int q = '0';
9+
int w = '1';
10+
int p1 = ops;
11+
int p2 = ops;
12+
for (int i = 0; i < s.length(); i++) {
13+
if (arr2[i] != q) {
14+
p1--;
15+
}
16+
if (arr2[i] != w) {
17+
p2--;
18+
}
19+
if (q == '0') {
20+
q = '1';
21+
} else {
22+
q = '0';
23+
}
24+
if (w == '0') {
25+
w = '1';
26+
} else {
27+
w = '0';
28+
}
29+
}
30+
if (p1 >= 0 || p2 >= 0) {
31+
return 1;
32+
}
33+
int low = 2;
34+
int high = s.length();
35+
int ans = 0;
36+
int n = s.length();
37+
while (low <= high) {
38+
int mid = (low + high) / 2;
39+
char[] arr = s.toCharArray();
40+
int p = ops;
41+
int c = 1;
42+
for (int i = 1; i < n; i++) {
43+
if (arr[i] == arr[i - 1]) {
44+
c++;
45+
} else {
46+
c = 1;
47+
}
48+
if (c > mid) {
49+
if (arr[i - 1] == '0') {
50+
arr[i - 1] = '1';
51+
} else {
52+
arr[i - 1] = '0';
53+
}
54+
p--;
55+
c = 0;
56+
}
57+
}
58+
if (p < 0) {
59+
low = mid + 1;
60+
} else {
61+
ans = mid;
62+
high = mid - 1;
63+
}
64+
}
65+
return ans;
66+
}
67+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
3398\. Smallest Substring With Identical Characters I
2+
3+
Hard
4+
5+
You are given a binary string `s` of length `n` and an integer `numOps`.
6+
7+
You are allowed to perform the following operation on `s` **at most** `numOps` times:
8+
9+
* Select any index `i` (where `0 <= i < n`) and **flip** `s[i]`. If `s[i] == '1'`, change `s[i]` to `'0'` and vice versa.
10+
11+
You need to **minimize** the length of the **longest** substring of `s` such that all the characters in the substring are **identical**.
12+
13+
Return the **minimum** length after the operations.
14+
15+
**Example 1:**
16+
17+
**Input:** s = "000001", numOps = 1
18+
19+
**Output:** 2
20+
21+
**Explanation:**
22+
23+
By changing `s[2]` to `'1'`, `s` becomes `"001001"`. The longest substrings with identical characters are `s[0..1]` and `s[3..4]`.
24+
25+
**Example 2:**
26+
27+
**Input:** s = "0000", numOps = 2
28+
29+
**Output:** 1
30+
31+
**Explanation:**
32+
33+
By changing `s[0]` and `s[2]` to `'1'`, `s` becomes `"1010"`.
34+
35+
**Example 3:**
36+
37+
**Input:** s = "0101", numOps = 0
38+
39+
**Output:** 1
40+
41+
**Constraints:**
42+
43+
* `1 <= n == s.length <= 1000`
44+
* `s` consists only of `'0'` and `'1'`.
45+
* `0 <= numOps <= n`
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package g3301_3400.s3399_smallest_substring_with_identical_characters_ii;
2+
3+
// #Hard #2024_12_24_Time_11_ms_(100.00%)_Space_45.7_MB_(54.55%)
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class Solution {
9+
public int minLength(String s, int numOps) {
10+
int l = s.length();
11+
int lingyi = 0;
12+
int yiling = 0;
13+
List<Integer> pq = new ArrayList<>();
14+
char thisone = s.charAt(0);
15+
int chang = 1;
16+
if (thisone == '0') {
17+
yiling++;
18+
} else {
19+
lingyi++;
20+
}
21+
for (int i = 1; i < l; i++) {
22+
char cur = s.charAt(i);
23+
if (cur == thisone) {
24+
chang++;
25+
} else {
26+
if (chang >= 2) {
27+
pq.add(chang);
28+
}
29+
chang = 1;
30+
thisone = cur;
31+
}
32+
if (i % 2 == 0) {
33+
if (cur == '0') {
34+
yiling++;
35+
} else {
36+
lingyi++;
37+
}
38+
} else {
39+
if (cur == '0') {
40+
lingyi++;
41+
} else {
42+
yiling++;
43+
}
44+
}
45+
}
46+
if (numOps >= lingyi || numOps >= yiling) {
47+
return 1;
48+
}
49+
if (chang >= 2) {
50+
pq.add(chang);
51+
}
52+
int one = -1;
53+
int two = -1;
54+
for (int cur : pq) {
55+
if (cur > one) {
56+
two = one;
57+
one = cur;
58+
} else if (cur > two) {
59+
two = cur;
60+
}
61+
}
62+
if (two == -1) {
63+
return one / (numOps + 1) > 1 ? one / (numOps + 1) : 2;
64+
}
65+
if (numOps == 0) {
66+
return one;
67+
}
68+
if (numOps == 1) {
69+
return (one / 2 > two) ? (one / 2 == 1 ? 2 : one / 2) : two;
70+
}
71+
int left = 2;
72+
int right = l / (numOps + 1);
73+
while (left < right) {
74+
int mid = left + (right - left) / 2;
75+
int sum = 0;
76+
for (Integer integer : pq) {
77+
sum += integer / (mid + 1);
78+
}
79+
if (sum <= numOps) {
80+
right = mid;
81+
} else {
82+
left = mid + 1;
83+
}
84+
}
85+
return left;
86+
}
87+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
3399\. Smallest Substring With Identical Characters II
2+
3+
Hard
4+
5+
You are given a binary string `s` of length `n` and an integer `numOps`.
6+
7+
You are allowed to perform the following operation on `s` **at most** `numOps` times:
8+
9+
* Select any index `i` (where `0 <= i < n`) and **flip** `s[i]`. If `s[i] == '1'`, change `s[i]` to `'0'` and vice versa.
10+
11+
You need to **minimize** the length of the **longest** substring of `s` such that all the characters in the substring are **identical**.
12+
13+
Return the **minimum** length after the operations.
14+
15+
**Example 1:**
16+
17+
**Input:** s = "000001", numOps = 1
18+
19+
**Output:** 2
20+
21+
**Explanation:**
22+
23+
By changing `s[2]` to `'1'`, `s` becomes `"001001"`. The longest substrings with identical characters are `s[0..1]` and `s[3..4]`.
24+
25+
**Example 2:**
26+
27+
**Input:** s = "0000", numOps = 2
28+
29+
**Output:** 1
30+
31+
**Explanation:**
32+
33+
By changing `s[0]` and `s[2]` to `'1'`, `s` becomes `"1010"`.
34+
35+
**Example 3:**
36+
37+
**Input:** s = "0101", numOps = 0
38+
39+
**Output:** 1
40+
41+
**Constraints:**
42+
43+
* <code>1 <= n == s.length <= 10<sup>5</sup></code>
44+
* `s` consists only of `'0'` and `'1'`.
45+
* `0 <= numOps <= n`
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package g3301_3400.s3398_smallest_substring_with_identical_characters_i;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class SolutionTest {
9+
@Test
10+
void minLength() {
11+
assertThat(new Solution().minLength("000001", 1), equalTo(1));
12+
}
13+
14+
@Test
15+
void minLength2() {
16+
assertThat(new Solution().minLength("0000", 2), equalTo(1));
17+
}
18+
19+
@Test
20+
void minLength3() {
21+
assertThat(new Solution().minLength("0101", 0), equalTo(1));
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package g3301_3400.s3399_smallest_substring_with_identical_characters_ii;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class SolutionTest {
9+
@Test
10+
void minLength() {
11+
assertThat(new Solution().minLength("000001", 1), equalTo(2));
12+
}
13+
14+
@Test
15+
void minLength2() {
16+
assertThat(new Solution().minLength("0000", 2), equalTo(1));
17+
}
18+
19+
@Test
20+
void minLength3() {
21+
assertThat(new Solution().minLength("0101", 0), equalTo(1));
22+
}
23+
}

0 commit comments

Comments
 (0)