字符串的前缀分数和
难度:
标签:
题目描述
代码结果
运行时间: 1308 ms, 内存: 202.7 MB
/*
* 题目思路:
* 1. 使用 Java Stream 来计算前缀的出现次数。
* 2. 计算每个单词的前缀分数总和。
*/
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SolutionStream {
public int[] prefixScores(String[] words) {
Map<String, Long> prefixCount = Arrays.stream(words)
.flatMap(word -> IntStream.rangeClosed(1, word.length()).mapToObj(i -> word.substring(0, i)))
.collect(Collectors.groupingBy(prefix -> prefix, Collectors.counting()));
return Arrays.stream(words)
.mapToInt(word -> IntStream.rangeClosed(1, word.length())
.map(i -> prefixCount.get(word.substring(0, i)).intValue())
.sum())
.toArray();
}
public static void main(String[] args) {
SolutionStream sol = new SolutionStream();
String[] words = {"abc", "ab", "bc", "b"};
int[] result = sol.prefixScores(words);
Arrays.stream(result).forEach(System.out::println);
}
}
解释
方法:
这道题目可以通过使用字典树(Trie)的数据结构来高效解决。首先,构建一个字典树,其中每个节点存储了到当前节点为止的字符串前缀出现的次数。这样,当再次遍历每个单词的每个前缀时,可以直接从字典树中获取该前缀出现的次数,从而计算出每个单词的前缀分数和。具体步骤包括:1. 构建字典树,记录每个前缀出现的次数。2. 对每个单词,查询其所有前缀在字典树中的出现次数,并累加得到该单词的前缀分数和。
时间复杂度:
O(n*L)
空间复杂度:
O(n*L)
代码细节讲解
🦆
在构建字典树时,如何确保每个节点准确记录下到该节点为止的字符串前缀出现的次数?
▷🦆
在字典树的实现中,'#'键所存储的值具体代表了什么?
▷🦆
如何处理字典树中的边界情况,比如单词全部由相同字符组成的情况?
▷🦆
在对单词进行前缀分数计算时,是否有可能出现访问字典树中未定义的节点的情况?如果有,该如何预防?
▷