File tree Expand file tree Collapse file tree 6 files changed +290
-0
lines changed
s3398_smallest_substring_with_identical_characters_i
s3399_smallest_substring_with_identical_characters_ii
s3398_smallest_substring_with_identical_characters_i
s3399_smallest_substring_with_identical_characters_ii Expand file tree Collapse file tree 6 files changed +290
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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 `
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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 `
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments