///|
pub fn osa_distance(a : String, b : String) -> Int {
  let a_chars = a.to_array()
  let b_chars = b.to_array()
  let a_len = a_chars.length()
  let b_len = b_chars.length()
  if a_len == 0 {
    return b_len
  }
  if b_len == 0 {
    return a_len
  }
  let mut prev_two : Array[Int] = Array::new(capacity=b_len + 1)
  let mut prev : Array[Int] = Array::new(capacity=b_len + 1)
  let mut curr : Array[Int] = Array::make(b_len + 1, 0)
  for j in 0..<=b_len {
    prev_two.push(j)
    prev.push(j)
  }
  let mut prev_a_char = '\u0000'
  for i in 0.. 0 &&
        j > 0 &&
        a_chars[i] != b_chars[j] &&
        a_chars[i] == prev_b_char &&
        b_chars[j] == prev_a_char {
        curr[j + 1] = @cmp.minimum(curr[j + 1], prev_two[j - 1] + 1)
      }
      prev_b_char = b_chars[j]
    }
    let tmp = prev_two
    prev_two = prev
    prev = curr
    curr = tmp
    prev_a_char = a_chars[i]
  }
  prev[b_len]
}