https://atcoder.jp/contests/abc447/tasks/abc447_d
Aはなるべく左から取ったほうがよくて、BもAより右でなるべく左から取ったほうがよくて、という感じなので、尺取り法的に行えばよいです。
// Take ABC 2 #![allow(non_snake_case)] //////////////////// library //////////////////// fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } //////////////////// process //////////////////// fn F(S: String) -> i32 { let cs: Vec<char> = S.chars().collect(); let L = cs.len(); let mut counter: i32 = 0; let mut k: usize = 0; let mut l: usize = 0; let mut m: usize = 0; while k < L && l < L && m < L { if cs[k] != 'A' { k += 1 } else if l <= k || cs[l] != 'B' { l += 1 } else if m <= l || cs[m] != 'C' { m += 1 } else { counter += 1; k += 1; l += 1; m += 1 } } counter } fn main() { let S: String = read(); println!("{}", F(S)) }