最短补全词
难度:
标签:
题目描述
代码结果
运行时间: 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)
代码细节讲解
🦆
在题解中,对于车牌字符的处理为什么选择存储为列表而不是使用字典来记录每个字母的频率?
▷🦆
题解中提到的删除单词列表中的字母操作,为什么选择对原列表进行修改而不是创建一个新的字典或列表来处理频率?
▷🦆
如何处理并确保每个字母在单词中的出现频率不仅要存在而且不少于车牌中的频率?
▷🦆
题解中提到的最短补全词的判定逻辑是否确保了当存在多个符合条件的最短补全词时,返回第一个出现的那个?
▷