https://leetcode.com/problems/one-edit-distance/#/description
Given two strings S and T, determine if they are both one edit distance apart.
Sol:
In computational linguistics and computer science, edit distance is a way of quantifying how dissimilar two strings (e.g., words) are to one another by counting the minimum number of operations required to transform one string into the other.
If
sandtare one distance away then no matter it is insert or delete or replace the count of common characters must bemax(m, n) - 1, wheremis the length ofsandnis the length oft. It is easy to see that the reverse is also true.Assume the length of common prefix (from left to right) is
iand the length of common suffix afteri(from right to left) isj, the answer is thenmax(m, n) - 1 == i + jExample 1 (1 replace)
s = "abcdefg", m = 7 t = "abcxefg", n = 7 i = 3, j = 3 max(m, n) - 1 == i + j is trueExample 2 (0 edit)
s = "abcdefg", m = 7 t = "abcdefg", n = 7 i = 7, j = 0 max(m, n) - 1 == i + j is falseExample 3 (1 insert)
s = "abcdefg", m = 7 t = "abcefg", n = 6 i = 3, j = 3 max(m, n) - 1 == i + j is trueExample 4 (1 delete 1 insert)
s = "abcdefg", m = 7 t = "abcefgh", n = 7 i = 3, j = 0 max(m, n) - 1 == i + j is falseThe method is O(m+n) since any character is visited at most once.
class Solution(object): def isOneEditDistance(self, s, t): """ :type s: str :type t: str :rtype: bool """ if abs(len(s) - len(t)) > 1: return False min_len = min(len(s), len(t)) left = right = 0 while left < min_len and s[left] == t[left]: left += 1 while right < min_len - left and s[~right] == t[~right]: right += 1 return max(len(s), len(t)) - (left + right) == 1
Note:
1 The usage of ~ in Python string operation.
ex. a= [1,2,3,4,5,6]
i = 1
a[i] = 2
a[~i] = 5
Sol 2:
class Solution(object): def isOneEditDistance(self, s, t): """ :type s: str :type t: str :rtype: bool """ if len(s) > len(t): return self.isOneEditDistance(t,s) if abs(len(s) - len(t)) > 1 or s == t: return False for i in range(len(s)): if s[i] != t[i]: # check replacement or deletion operation return s[i+1:] == t[i+1:] or s[i:] == t[i+1:] return True