面试高频题难度 2.5/5,简单结合 DFS 的 Trie 模板级运用题
Posted 宫水三叶的刷题日记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试高频题难度 2.5/5,简单结合 DFS 的 Trie 模板级运用题相关的知识,希望对你有一定的参考价值。
题目描述
这是 LeetCode 上的 「677. 键值映射」 ,难度为 「中等」。
Tag : 「字典树」、「DFS」、「哈希表」
实现一个 MapSum
类,支持两个方法,insert
和 sum
:
-
MapSum()
初始化MapSum
对象 -
void insert(String key, int val)
插入key-val
键值对,字符串表示键key
,整数表示值val
。如果键key
已经存在,那么原来的键值对将被替代成新的键值对。 -
int sum(string prefix)
返回所有以该前缀prefix
开头的键key
的值的总和。
示例:
输入:
["MapSum", "insert", "sum", "insert", "sum"]
[[], ["apple", 3], ["ap"], ["app", 2], ["ap"]]
输出:
[null, null, 3, null, 5]
解释:
MapSum mapSum = new MapSum();
mapSum.insert("apple", 3);
mapSum.sum("ap"); // return 3 (apple = 3)
mapSum.insert("app", 2);
mapSum.sum("ap"); // return 5 (apple + app = 3 + 2 = 5)
提示:
-
-
key
和prefix
仅由小写英文字母组成 -
1 <= val <= 1000
-
最多调用 50
次insert
和sum
Trie + DFS
从需要实现「存储字符串(映射关系)」并「检索某个字符串前缀的总和」来看,可以知道这是与 相关的题目,还不了解 的同学可以先看前置 🧀:实现 Trie (前缀树) 。
考虑如何实现两个操作:
-
insert
:在基本的 插入操作的基础上进行拓展即可。与常规的插入操作的唯一区别为,不能简单记录单词的结束位置,还要存储 对应的 是多少。具体的我们可以使用int
类型的数组 来代替原有的boolean
类型的数组 ; -
sum
: 先对入参 进行字典树搜索,到达尾部后再使用DFS
搜索后面的所有方案,并累加结果。
代码(static
优化代码见
,避免每个样例都 new
大数组):
class MapSum
int[][] tr = new int[2510][26];
int[] hash = new int[2510];
int idx;
public void insert(String key, int val)
int p = 0;
for (int i = 0; i < key.length(); i++)
int u = key.charAt(i) - 'a';
if (tr[p][u] == 0) tr[p][u] = ++idx;
p = tr[p][u];
hash[p] = val;
public int sum
参考技术A
给你一个字符串 s,找到 s 中最长的回文子串。
题目难度: , 中等
示例 1:
示例 2:
提示:
1、动态规划
主要思路:
执行结果分析:
时间复杂度:O(n^2) 其中 n 是字符串的长度。
空间复杂度:O(n^2)。
1、Java
2、Python3
Python好慢,花了7秒
3、C++
以上是关于面试高频题难度 2.5/5,简单结合 DFS 的 Trie 模板级运用题的主要内容,如果未能解决你的问题,请参考以下文章
Android大厂校招经验+高频面试题(2021结合自身整理)