diff --git a/src/main.rs b/src/main.rs index 7e0aab5..40b6c2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,37 +3,60 @@ use std::cmp::min; struct Solution; mod arr; impl Solution { - pub fn min_operations(s: String) -> i32 { - let (mut cnt_a, mut cnt_b) = (0, 0); - let mut cnt = 0; + pub fn min_flips(s: String) -> i32 { + let mut len = s.len(); + let (mut even_zero, mut even_one, mut odd_zero, mut odd_one) = (0, 0, 0, 0); + //let s = (s.clone() + &s).chars().collect::>(); + let mut ans = 1e6 as i32; + let mut is_even = true; + for c in s.chars() { - if cnt & 1 == 1 { + if is_even { + is_even = false; if c == '0' { - cnt_a += 1; + even_zero += 1; } else { - cnt_b += 1; + even_one += 1; + } + } else { + is_even = true; + if c == '0' { + odd_zero += 1; + } else { + odd_one += 1; + } + } + } + for c in s.chars() { + ans = min(ans, min(odd_zero + even_one, odd_one + even_zero)); + if len & 1 == 1 { + if c == '0' { + odd_zero += 1; + } else { + odd_one += 1; } } else { if c == '0' { - cnt_b += 1; + even_zero += 1; } else { - cnt_a += 1; + even_one += 1; } } - cnt += 1; + (even_zero, even_one, odd_zero, odd_one) = (odd_zero, odd_one, even_zero, even_one); + if c == '0' { + odd_zero -= 1; + } else { + odd_one -= 1; + } } - min(cnt_a, cnt_b) + ans } } - +// 111000 o0 1 o1 2 j0 2 j1 1 +// 1110001 o0 1 o1 3 j0 2 j1 1 +// 1110001 o0 2 o1 1 j0 1 j1 3 +// 110001 2 1 1 2 fn main() { - let result = Solution::min_operations("1111".to_string()); + let result = Solution::min_flips("111000".to_string()); println!("{:?}", result); } -// [[0,0,0,0,0,0], -// [0,0,1,0,0,0], -// [0,0,0,0,1,0], -// [0,0,0,0,0,0], -// [0,0,1,0,0,1], -// [0,0,0,0,0,0], -// [0,0,0,0,0,0]]