---
# System prepended metadata

title: Algorithms question

---

# Algorithms question
## Question
We define the `edit_distance` function on two strings to be the minimum number of substitutions, additions and removals of characters to get from the first string to the second.

For example
- `edit_distance("hello", "hallo") == 1`
- `edit_distance("hi", "hey") == 2`
- `edit_distance("ab", "ba") == 2` 
- `edit_distance("hello world", "xhello world") == 1`
- `edit_distance("hello world", "hello x world") == 2`
- `edit_distance("hello worldx", "xhello world") == 2`
- `edit_distance("abc", "") == 3`

## Solution
```rust
fn edit_distance(left: &str, right: &str) -> usize {
    if len(left) == 0 {
        return len(right);
    }
    if len(right) == 0 {
        return len(left);
    }
    if left[0] == right[0] {
        return edit_distance(&left[1..], &right[1..]);
    }
    return min(
        edit_distance(&left[1..], &right),
        edit_distance(left, &right[1..]),
        edit_distance(&left[1..], &right[1..]),
    ) + 1;
}

let x = 'label: loop {
  break "test";  
};

let x = 'label: {
    if some_condition {
        break 'label "test";
    }
    oeauoaeu
    oeauoaeu
    "not test"
};

extern {
    type X;
}

struct S;


```

"abc", "xyz"
 "bc", "xyz",
   "c", "xyz",
     "", "xyz",
   "bc", "yz",
     "c", "yz",
       "", "yz",
     "bc", "z",
       ""
       


O(n * m)

