相隔为 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?
▷🦆
在处理字符串长度差异大于1的情况时,算法似乎直接返回了 False,这种做法是否充分考虑了所有可能的编辑距离场景?
▷🦆
为什么在找到第一个不同的字符后,直接比较剩余部分的字符串?这样的直接比较是否可能忽略了某些特殊字符或编码的影响?
▷🦆
在实际使用中,该算法适用于哪些类型的字符串输入?例如,是否适用于包含特殊字符或多语言字符的字符串?
▷相关问题
编辑距离
给你两个单词 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
word1
和word2
由小写英文字母组成