这个题解使用了最长公共子序列 (LCS) 的思路。主要步骤如下:
1. 先遍历 word2,用一个哈希表 idx 记录每个字符在 word2 中出现的所有位置。
2. 逆序遍历 word1,对于每个字符,在 idx 中找到它在 word2 中出现的位置。
3. 使用一个双端队列 tail 维护一个单调递增的序列,表示 LCS 在 word2 中的下标。对于每个位置,用二分查找在 tail 中找到第一个大于等于它的位置 j,如果 j 为 0 就插入到队首,否则替换 tail[j-1]。
4. 最后 tail 的长度就是 LCS 的长度,用两个单词的长度之和减去 2 倍的 LCS 长度即可得到删除操作的最小步数。
时间复杂度: 平均情况下的时间复杂度是 O(m * k_avg * log(min(m, n))),其中 k_avg 是字符在 word2 中的平均出现次数。最坏情况下的时间复杂度是 O(mn/c * log(min(m, n))),其中 c 是字符集的大小。
空间复杂度: 空间复杂度是 O(n)。
```python
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
# 记录 word2 中每个字符出现的位置
idx = defaultdict(list)
for i, c in enumerate(word2):
idx[c].append(i)
# 维护 LCS 在 word2 中的下标
tail = deque()
for c in word1[::-1]:
for i in idx[c]:
# 二分查找第一个大于等于 i 的位置 j
j = bisect_right(tail, i)
if j == 0:
# 如果 j 为 0,插入到队首
tail.appendleft(i)
else:
# 否则替换 tail[j-1]
tail[j - 1] = i
# 两个单词的长度之和减去 2 倍的 LCS 长度
return len(word1) + len(word2) - 2 * len(tail)
```