leetcode
leetcode 651 ~ 700
最短补全词

最短补全词

难度:

标签:

题目描述

代码结果

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


/*
题目思路:
1. 使用流API提取licensePlate中的字母,并统计每个字母的频率。
2. 过滤出words数组中包含所有这些字母的单词。
3. 返回长度最短的单词,如果有多个,返回最先出现的那个。
*/
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
 
public class ShortestCompletingWordStream {
    public static String shortestCompletingWord(String licensePlate, String[] words) {
        // 统计licensePlate中的字母频率
        Map<Character, Long> targetCount = licensePlate.toLowerCase().chars()
            .filter(Character::isLetter)
            .mapToObj(c -> (char) c)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        
        return Arrays.stream(words)
            .filter(word -> {
                Map<Character, Long> wordCount = word.chars()
                    .mapToObj(c -> (char) c)
                    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
                return targetCount.entrySet().stream()
                    .allMatch(e -> wordCount.getOrDefault(e.getKey(), 0L) >= e.getValue());
            })
            .min((a, b) -> Integer.compare(a.length(), b.length()))
            .orElse("");
    }
}

解释

方法:

这个题解的思路是先将车牌中的字母全部转换为小写并存储在一个列表中。然后遍历给定的单词列表,对于每个单词,先将其转换为列表,然后对车牌中的每个字母,检查其是否在当前单词列表中,如果不在则跳出当前单词的检查。如果车牌中的所有字母都在当前单词中,则检查该单词的长度是否小于当前的最短长度,如果是则更新最短长度和答案。最终返回找到的最短补全词。

时间复杂度:

O(nm+nk)

空间复杂度:

O(m+k)

代码细节讲解

🦆
在题解中,对于车牌字符的处理为什么选择存储为列表而不是使用字典来记录每个字母的频率?
在题解中使用列表而非字典主要是为了简化代码实现的复杂度。使用列表可以直接存储每个字母并在遍历单词时直接进行检查和移除。然而,这种方法可能不够高效,因为它没有考虑到字母的频率,每次检查都需要从单词中移除字母,这在频繁操作时效率较低。使用字典记录字母的频率会是一个更高效的解决方案,因为它可以减少不必要的重复检查和删除操作,尤其是当车牌中字母重复或单词很长时。
🦆
题解中提到的删除单词列表中的字母操作,为什么选择对原列表进行修改而不是创建一个新的字典或列表来处理频率?
题解选择直接修改原列表的方法可能是出于简化实现的考虑。这种方法直接在原列表上操作,避免了额外的数据结构的引入,但会影响算法的时间复杂度,特别是在需要频繁删除操作时。相比之下,使用字典来处理字母频率虽然在空间上稍有增加,但可以显著提高效率,因为它允许快速检查和更新字母频率而不需要多次遍历和修改列表。
🦆
如何处理并确保每个字母在单词中的出现频率不仅要存在而且不少于车牌中的频率?
要确保每个字母不仅在单词中存在,而且其出现频率至少与车牌中的相同,应当在处理开始时使用字典记录车牌中每个字母的频率。随后,当检查单词是否为有效的补全词时,同样统计单词中每个字母的频率,并与车牌字母频率进行比较。只有当单词中的字母频率大于或等于车牌中的相应字母频率时,该单词才符合条件。这种方法确保了频率的准确对比,是比简单列表删除更精确的处理方式。
🦆
题解中提到的最短补全词的判定逻辑是否确保了当存在多个符合条件的最短补全词时,返回第一个出现的那个?
题解中的逻辑确实确保了当存在多个符合条件的最短补全词时,返回第一个找到的。这是因为题解在找到一个新的最短补全词时立即更新答案,而且没有进一步的检查是否有其他同样长度的补全词。因此,一旦遇到长度更短的补全词,之前的答案就被替换,这保证了答案的顺序性,即第一个符合条件的最短补全词会被返回。

相关问题