leetcode
leetcode 151 ~ 200
相隔为 1 的编辑距离

相隔为 1 的编辑距离

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 16.0 MB


/*
题目思路:
1. 我们需要检查两个字符串 s 和 t 是否仅通过一次插入、删除或替换操作可以相互转换。
2. 如果两个字符串长度相差超过1,则直接返回false。
3. 使用双指针方法来遍历两个字符串。
4. 如果发现字符不匹配,记录这个不匹配,并根据不同情况移动指针。
5. 如果超过一次不匹配,返回false。
注意:Java Stream 并不适合处理这种有状态的操作,因此仍然需要使用一些常规方法。
*/
 
import java.util.stream.*;
 
public class Solution {
    public boolean isOneEditDistance(String s, String t) {
        int m = s.length();
        int r = t.length();
        if (Math.abs(m - r) > 1) return false;
        return IntStream.range(0, Math.min(m, r)).filter(i -> s.charAt(i) != t.charAt(i)).findFirst().map(i -> {
            if (m == r) {
                return s.substring(i + 1).equals(t.substring(i + 1)); // 替换操作
            } else if (m < r) {
                return s.substring(i).equals(t.substring(i + 1)); // 插入操作
            } else {
                return s.substring(i + 1).equals(t.substring(i)); // 删除操作
            }
        }).orElse(Math.abs(m - r) == 1);
    }
}

解释

方法:

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

时间复杂度:

O(min(len_s, len_t))

空间复杂度:

O(1)

代码细节讲解

🦆
在算法中,如果两个字符串完全相同但长度相等,为什么返回的是 False 而不是 True?
该算法的目标是判断两个字符串之间是否存在恰好一次的编辑操作(包括插入一个字符、删除一个字符或修改一个字符)使得两者相等。如果两个字符串完全相同且长度相等,意味着它们之间不需要任何编辑操作就已经相等了。因此,在这种情况下,它们的编辑距离为0而不是1,所以函数返回 False,因为我们要寻找的是编辑距离恰好为1的情况。
🦆
在处理字符串长度差异大于1的情况时,算法似乎直接返回了 False,这种做法是否充分考虑了所有可能的编辑距离场景?
是的,这种做法充分考虑了题目的要求。当两个字符串的长度差异大于1时,无法通过单一的编辑操作(仅一次插入、删除或修改)来使字符串变得相等。因此,如果长度差大于1,那么它们的编辑距离至少为2。算法在这种情况下返回 False 是正确的,因为我们只关心那些编辑距离恰好为1的情况。
🦆
为什么在找到第一个不同的字符后,直接比较剩余部分的字符串?这样的直接比较是否可能忽略了某些特殊字符或编码的影响?
在找到第一个不同的字符后,直接比较剩余部分的字符串是基于假设:如果两个字符串在某处有一个字符不同,那么剩余部分必须完全相同,才能保证总的编辑距离为1(即仅这一个不同的位置是通过一次编辑得到的)。直接比较字符串是基于字符串的字面值,不依赖于字符的特殊编码或属性。因此,这种比较方法是有效的,并且能够正确处理包含任何类型字符的字符串,包括特殊字符或多语言字符。
🦆
在实际使用中,该算法适用于哪些类型的字符串输入?例如,是否适用于包含特殊字符或多语言字符的字符串?
该算法适用于所有类型的字符串输入,包括ASCII字符、Unicode字符、特殊符号以及多语言文本。算法基于Python的字符串处理功能,这些功能良好地支持多种字符编码。由于算法是逐字符比较,并检查剩余子字符串是否相等,因此它能够正确处理包含任何字符的字符串。不管字符串包含何种字符,只要它们的编辑距离恰好为1,该算法都能正确返回 True。

相关问题

编辑距离

给你两个单词 word1 和 word2请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

 

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

 

提示:

  • 0 <= word1.length, word2.length <= 500
  • word1word2 由小写英文字母组成