1
- /*
1
+ // Runtime: 154 ms (Top 50.0%) | Memory: 48.85 MB (Top 59.5%)
2
2
3
- startZeroNumFlips: number of flips if string were to start at i and start with 0
4
- startOneNumFlips: number of flips if string were to start at i and start with 1
5
-
6
- */
7
- var minFlips = function ( s ) {
8
- // value to hold starting with zero
9
- let startZeroNumFlips = 0 ;
10
- for ( let i = 0 ; i < s . length ; i ++ ) {
11
- if ( i % 2 ) {
12
- if ( s [ i ] === '0' ) startZeroNumFlips ++ ;
13
- } else {
14
- if ( s [ i ] === '1' ) startZeroNumFlips ++ ;
15
- }
3
+ /**
4
+ * @param {string } s
5
+ * @return {number }
6
+ */
7
+ var minFlips = function ( s ) {
8
+ let length = s . length - 1
9
+ let flipMap = {
10
+ '1' : '0' ,
11
+ '0' : '1'
16
12
}
17
- let startOneNumFlips = s . length - startZeroNumFlips ;
13
+ s = s + s
14
+ let alt1 = '1'
15
+ let alt2 = '0'
16
+ let left = 0
17
+ let right = 0
18
+ let diff1 = 0
19
+ let diff2 = 0
20
+ let min = Infinity
18
21
19
- let minimumFlips = Math . min ( startZeroNumFlips , startOneNumFlips ) ;
20
- const isEvenLength = s . length % 2 === 0 ;
21
-
22
- for ( let i = 1 ; i < s . length ; i ++ ) {
23
-
24
- // check the previous char to see which
25
- // value to decrement
26
- if ( s [ i - 1 ] === '1' ) {
27
- startZeroNumFlips -- ;
28
- } else {
29
- startOneNumFlips -- ;
22
+ while ( right < s . length ) {
23
+ if ( right > 0 ) {
24
+ alt1 = flipMap [ alt1 ]
25
+ alt2 = flipMap [ alt2 ]
30
26
}
31
27
32
- // swap the 2 variables because we shifted the index by 1
33
- [ startOneNumFlips , startZeroNumFlips ] = [ startZeroNumFlips , startOneNumFlips ] ;
34
-
35
- // add corresponding number of flips
36
- if ( isEvenLength ) {
37
- if ( s [ i - 1 ] === '1' ) {
38
- startOneNumFlips ++ ;
28
+ let current = s [ right ]
29
+ if ( current !== alt1 ) diff1 ++
30
+ if ( current !== alt2 ) diff2 ++
31
+ if ( right - left === length ) {
32
+ min = Math . min ( diff1 , diff2 , min )
33
+ if ( ( length + 1 ) % 2 === 0 ) {
34
+ if ( s [ left ] !== flipMap [ alt1 ] ) diff1 --
35
+ if ( s [ left ] !== flipMap [ alt2 ] ) diff2 --
39
36
} else {
40
- startZeroNumFlips ++ ;
41
- }
42
- } else {
43
- if ( s [ i - 1 ] === '1' ) {
44
- startZeroNumFlips ++ ;
45
- } else {
46
- startOneNumFlips ++ ;
37
+ if ( s [ left ] !== alt1 ) diff1 --
38
+ if ( s [ left ] !== alt2 ) diff2 --
47
39
}
40
+ left ++
48
41
}
49
-
50
- // calculate the number of flips
51
- minimumFlips = Math . min ( startZeroNumFlips , startOneNumFlips , minimumFlips ) ;
42
+ right ++
52
43
}
53
- return minimumFlips ;
54
- } ;
44
+ return min
45
+ } ;
0 commit comments