Use iterators instead of explicit indexing

This commit is contained in:
2022-12-06 18:37:38 +01:00
parent 7c7c69255d
commit 1cd5579bf6

View File

@@ -3,20 +3,22 @@ use anyhow::Result;
fn find_first(input: &[u8], unique: usize) -> Result<usize> { fn find_first(input: &[u8], unique: usize) -> Result<usize> {
let mut seen = [false; 256]; let mut seen = [false; 256];
let mut tail_it = input.iter();
let mut first = 0; let mut first = 0;
// Loop invariant: input[first..last] contains only unique characters // Loop invariant: input[first..last] contains only unique characters
for (last, &c) in input.iter().enumerate() { for (last, &c) in input.iter().enumerate() {
if seen[c as usize] { if seen[c as usize] {
while input[first] != c { first += (&mut tail_it)
seen[input[first] as usize] = false; .take_while(|&&b| b != c)
first += 1; .map(|&b| seen[b as usize] = false)
} .count()
first += 1; + 1; // +1 because take_while doesn't return the first element that didn't satisfy the condition, while we do need to count it
} else { } else {
// New unique character found: input[first..=last] contains unique characters // New unique character found: input[first..=last] contains unique characters
if last - first + 1 == unique { if last - first + 1 == unique {
return Ok(first + unique); return Ok(last + 1);
} }
seen[c as usize] = true; seen[c as usize] = true;