相隔为 1 的编辑距离

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def isOneEditDistance(self, s: str, t: str) -> bool:
        len_s = len(s)
        len_t = len(t)
        for i in range(min(len_s, len_t)):
            if (s[i] != t[i]):
                if len_s == len_t:
                    return s[i + 1:] == t[i + 1:]
                elif len_s < len_t:
                    return s[i: ] == t[i + 1:]
                else:
                    return s[i+1:] == t[i:]
        if abs(len_s - len_t) == 1:
            return True
        else:
            return False

Explain

该题解的思路是逐个比较两个字符串 s 和 t 的字符,找到第一个不同的位置,然后根据两个字符串的长度关系进行判断:1. 如果两个字符串长度相同,则判断剩余部分是否完全相同;2. 如果 s 比 t 短,则判断 s 剩余部分是否与 t 剩余部分(从不同字符的下一个位置开始)完全相同;3. 如果 s 比 t 长,则判断 s 剩余部分(从不同字符的下一个位置开始)是否与 t 剩余部分完全相同。最后,如果两个字符串长度差正好为1,且上述三种情况都不满足,则说明相隔为 1 的编辑距离。

时间复杂度: O(min(len_s, len_t))

空间复杂度: O(1)

class Solution:
    def isOneEditDistance(self, s: str, t: str) -> bool:
        len_s = len(s)
        len_t = len(t)
        for i in range(min(len_s, len_t)):
            # 找到第一个不同的字符
            if (s[i] != t[i]):
                if len_s == len_t:
                    # 如果两个字符串长度相同,判断剩余部分是否完全相同
                    return s[i + 1:] == t[i + 1:]
                elif len_s < len_t:
                    # 如果 s 比 t 短,判断 s 剩余部分是否与 t 剩余部分(从不同字符的下一个位置开始)完全相同
                    return s[i: ] == t[i + 1:]
                else:
                    # 如果 s 比 t 长,判断 s 剩余部分(从不同字符的下一个位置开始)是否与 t 剩余部分完全相同
                    return s[i+1:] == t[i:]
        # 如果遍历结束都没有找到不同的字符,则判断两个字符串长度差是否为1
        if abs(len_s - len_t) == 1:
            return True
        else:
            return False

Explore

该算法的目标是判断两个字符串之间是否存在恰好一次的编辑操作(包括插入一个字符、删除一个字符或修改一个字符)使得两者相等。如果两个字符串完全相同且长度相等,意味着它们之间不需要任何编辑操作就已经相等了。因此,在这种情况下,它们的编辑距离为0而不是1,所以函数返回 False,因为我们要寻找的是编辑距离恰好为1的情况。

是的,这种做法充分考虑了题目的要求。当两个字符串的长度差异大于1时,无法通过单一的编辑操作(仅一次插入、删除或修改)来使字符串变得相等。因此,如果长度差大于1,那么它们的编辑距离至少为2。算法在这种情况下返回 False 是正确的,因为我们只关心那些编辑距离恰好为1的情况。

在找到第一个不同的字符后,直接比较剩余部分的字符串是基于假设:如果两个字符串在某处有一个字符不同,那么剩余部分必须完全相同,才能保证总的编辑距离为1(即仅这一个不同的位置是通过一次编辑得到的)。直接比较字符串是基于字符串的字面值,不依赖于字符的特殊编码或属性。因此,这种比较方法是有效的,并且能够正确处理包含任何类型字符的字符串,包括特殊字符或多语言字符。

该算法适用于所有类型的字符串输入,包括ASCII字符、Unicode字符、特殊符号以及多语言文本。算法基于Python的字符串处理功能,这些功能良好地支持多种字符编码。由于算法是逐字符比较,并检查剩余子字符串是否相等,因此它能够正确处理包含任何字符的字符串。不管字符串包含何种字符,只要它们的编辑距离恰好为1,该算法都能正确返回 True。