Skip to main content

161. One Edit Distance

https://leetcode.com/problems/one-edit-distance

  • CTCI 1.5 One Away

Python

class Solution:
def isOneEditDistance(self, s: str, t: str) -> bool:
if s == t:
return False
elif len(s) == len(t):
return self.one_edit_replace(s, t)
elif len(s)+1 == len(t):
return self.one_edit_insert(s, t)
elif len(s)-1 == len(t):
return self.one_edit_insert(t, s)

return False

def one_edit_insert(self, s1, s2) -> bool:
cur1, cur2 = 0, 0
while cur1 < len(s1) and cur2 < len(s2):
if s1[cur1] != s2[cur2]:
if cur1 != cur2:
return False
cur2 += 1
else:
cur1 += 1
cur2 += 1
return True

def one_edit_replace(self, s1, s2) -> bool:
see_diff = False
for i in range(len(s1)):
if s1[i] != s2[i]:
if see_diff:
return False
see_diff = True
return True

Rust

impl Solution {
pub fn is_one_edit_distance(s: String, t: String) -> bool {
if s == t {
return false;
} else if s.len() == t.len() {
return Solution::one_edit_replace(s, t);
} else if s.len()+1 == t.len() {
return Solution::one_edit_insert(s, t);
} else if s.len()-1 == t.len() {
return Solution::one_edit_insert(t, s);
}

false
}

pub fn one_edit_insert(s1: String, s2: String) -> bool {
let mut cur1: usize = 0;
let mut cur2: usize = 0;

while cur1 < s1.len() && cur2 < s2.len() {
if s1.chars().nth(cur1) != s2.chars().nth(cur2) {
if cur1 != cur2 {
return false;
}
cur2 += 1;
} else {
cur1 += 1;
cur2 += 1;
}
}
true
}

pub fn one_edit_replace(s1: String, s2: String) -> bool {
let mut see_diff = false;
for i in 0..s1.len() {
if s1.chars().nth(i) != s2.chars().nth(i) {
if see_diff {
return false;
}
see_diff = true;
}
}
true
}
}