leetcode
leetcode 2101 ~ 2150
距离字典两次编辑以内的单词

距离字典两次编辑以内的单词

难度:

标签:

题目描述

代码结果

运行时间: 39 ms, 内存: 16.2 MB


/*
 * 题目思路:
 * 使用Java Stream API来解决这个问题。我们可以利用filter来筛选出符合条件的单词。
 * 对于每个query,通过dictionary中的单词计算编辑距离,若不超过2则加入结果集。
 */

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Solution {
    public List<String> twoEditWords(String[] queries, String[] dictionary) {
        return Arrays.stream(queries)
                .filter(query -> Arrays.stream(dictionary)
                        .anyMatch(word -> isWithinTwoEdits(query, word)))
                .collect(Collectors.toList());
    }

    // 判断两个字符串的编辑距离是否不超过2
    private boolean isWithinTwoEdits(String s1, String s2) {
        int differences = 0;
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                differences++;
                if (differences > 2) {
                    return false;
                }
            }
        }
        return true;
    }
}

解释

方法:

该题解采用了直接的暴力匹配方法来解决问题。对于每个查询词 (queries 中的词),它会与字典 (dictionary) 中的每个词进行比较。对每一对词,我们逐字符比较两个字符串,计算它们在每个位置上字符不同的数量,这个数量即为编辑距离。如果编辑距离在两次编辑(包括两次)以内,我们就认为这个查询词满足条件,并将其加入结果列表中。一旦一个查询词与字典中的某个词的编辑距离小于等于2,我们就结束对这个查询词的检查,因为我们只需要确定是否存在至少一个这样的字典词即可。

时间复杂度:

O(m * k * n)

空间复杂度:

O(m)

代码细节讲解

🦆
此题解中使用暴力匹配方法,对于每个queries中的单词,你是如何确定何时停止与dictionary中单词的比较?
在题解的实现中,对于每个查询词(来自queries列表),我们会逐一与字典中的所有单词比较。在比较过程中,我们记录两个单词之间的编辑距离。如果在比较过程中发现某个查询词与字典中某个单词的编辑距离小于或等于2,我们会立即停止对当前查询词的进一步比较。这是因为题目只要求验证是否存在至少一个字典中的单词与查询词的编辑距离在两次以内,一旦找到这样的单词,就无需再继续验证其他字典单词了。
🦆
如果queries和dictionary中的单词长度不相同,此题解是否仍适用?如果不适用,应如何修改代码以处理不同长度的单词?
当前的题解代码假设了queries和dictionary中的单词长度相同,因为它使用了固定的索引范围来比较两个字符串的每个字符。如果单词长度不同,这将导致索引错误或不充分的比较。要适应不同长度的单词,应修改代码以首先比较两个单词的长度差,如果长度差大于2,则编辑距离必然超过2;如果长度差在2以内,才进行逐字符比较。此外,逐字符比较时应处理较短单词的末尾,避免越界访问。
🦆
在比较两个单词的编辑距离时,你是怎样处理已经发现的编辑距离超过2的情况?
在题解中,当比较两个单词的过程中,我们通过逐字符比较来累计不同字符的数量作为编辑距离。一旦这个累计的编辑距离超过2,我们会立刻中断当前的比较。这是通过在循环中使用一个条件判断来实现的:如果`diff > 2`,则使用`break`语句跳出当前的循环。这样做可以避免不必要的比较,提高算法的效率。

相关问题