1888. 使二进制字符串字符交替的最少反转次数

This commit is contained in:
li_chx 2026-03-07 17:27:23 +08:00
parent 566c6a8414
commit c18ad8c1b0
Signed by: li_chx
GPG Key ID: 70D4985BB8180E92
1 changed files with 42 additions and 19 deletions

View File

@ -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::<Vec<_>>();
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]]