Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // MARK: - 161. One Edit Distance
- // Даны строки s и t, определить являются ли они одинаковыми после ОДНОГО редактирования
- // Возможности для редактирования:
- // РЕДАКТИРОВАТЬ МОЖНО ТОЛЬКО S!
- // Insert a character into s to get t
- // Delete a character from s to get t
- // Replace a character of s to get t
- func isOneEditDistanse(_ s: String, _ t: String) -> Bool {
- let s = Array(s).map{String($0)}
- let t = Array(t).map{String($0)}
- var lenS = s.count
- var lenT = t.count
- // если одна из строк слишком большая, то за одно действие их поменять нельзя
- // если строки равны, то тоже нельзя за 1 действие их поменять
- if abs(lenS-lenT) > 1 || s == t {
- return false
- }
- // Цикл будет проходить по индексам минимальной строки (иначе если будем проходит по большой будет index out of range)
- for i in 0..<min(lenS, lenT) {
- if s[i] != t[i] {
- // берем слайсы если буквы не равны
- // для replace - проверяем сходятся ли остальные части строк после этого индекса где есть отличия
- // для insert - проверяем сходятся ли строки если в t пропустим букву, которую в теории можно вставить в s
- // для delete - проверяем сходятся ли строки если в s пропустим букву - как бы удаляя ее
- // Если что-то вернет true, то true
- return s[i+1..<lenS] == t[i+1..<lenT] // Замена
- || s[i..<lenS] == t[i+1..<lenT] // Удаление из t
- || s[i+1..<lenS] == t[i..<lenT] // Вставка в s
- }
- }
- // Нужно обработать отдельный кейс, когда s = "a", t = "" - то есть удаление и t - пустая строка
- return true
- }
- isOneEditDistanse("abef", "acbef")
- isOneEditDistanse("acbref", "acbef")
- isOneEditDistanse("a", "")
- isOneEditDistanse("acgef", "acbef")
- isOneEditDistanse("ab", "acbef")
- isOneEditDistanse("abeffwefef", "acbef")
- isOneEditDistanse("acbef", "acbef")
- isOneEditDistanse("acbeffv", "acbefp")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement