力扣 第 385 场周赛 解题报告 | 珂学家 | 字典树专场


前言

在这里插入图片描述


整体评价

这是一场字典树专场,除了t3这个小模拟之外,1,2,4皆可用字典树搞定。

T4感觉做法挺多的,其实,但是字典树应该效率最高的。


T1. 统计前后缀下标对 I

思路: 模拟

O ( n 2 ) O(n^2) O(n2)全遍历即可

class Solution {public int countPrefixSuffixPairs(String[] words) {int res = 0;for (int i = 0; i < words.length; i++) {for (int j = 0; j < i; j++) {if (words[i].startsWith(words[j]) && words[i].endsWith(words[j])) {res ++;}}}return res;}
}

T2. 最长公共前缀的长度

思路: 字典树

这样的时间复杂度为

( m a x a i l e n ( w o r d a i ) ) ∗ ( ∑ b i l e n ( w o r d b i ) ) (max_{ai} len(word_{ai})) * (\sum_{bi} len(word_{bi})) (maxailen(wordai))(bilen(wordbi))

因为第一组的数字最大为8位数,因此其深度最多为8

public class Solution {static class Trie {Trie[] cs = new Trie[26];void add(String w) {Trie cur = this;for (char c: w.toCharArray()) {int p = c - '0';if (cur.cs[p] == null) {cur.cs[p] = new Trie();}cur = cur.cs[p];}}int query(String w) {Trie cur = this;int res = 0;for (char c: w.toCharArray()) {int p = c - '0';if (cur.cs[p] == null) {return res;}cur = cur.cs[p];res++;}return res;}}public int longestCommonPrefix(int[] arr1, int[] arr2) {Trie root = new Trie();for (int v: arr1) {root.add(String.valueOf(v));}int res = 0;for (int v: arr2) {int tmp = root.query(String.valueOf(v));res = Math.max(tmp, res);}return res;}}

T3. 出现频率最高的素数

思路: 模拟

知识点: 质数筛,质数判定

按题目模拟执行即可

class Solution {static int[][] dirs = new int[][] {{-1, 0}, {1, 0}, {0, -1}, {0, 1},{-1, -1}, {-1, 1}, {1, -1}, {1, 1}};List<Integer> create(int[][] mat, int y, int x) {List<Integer> res = new ArrayList<>();int n = mat.length, m = mat[0].length;for (int i = 0; i < dirs.length; i++) {int v = mat[y][x];int j = 0;int ty = y, tx = x;int base = 10;do {ty += dirs[i][0];tx += dirs[i][1];if (ty >= 0 && ty < n && tx >= 0 && tx < m) {v = v + mat[ty][tx] * base;} else {break;}base *= 10;res.add(v);} while(true);}return res;}boolean isPrime(int v) {if (v <= 1) return false;for (int i = 2; i <= v / i; i++) {if (v % i == 0) return false;}return true;}public int mostFrequentPrime(int[][] mat) {Map<Integer, Integer> hash = new HashMap<>();int n = mat.length, m = mat[0].length;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {List<Integer> tmp = create(mat, i, j);for (int v: tmp) {hash.merge(v, 1, Integer::sum);}}}    int fz = -1;int ans = -1;for (var kv: hash.entrySet()) {if (isPrime(kv.getKey()) && kv.getKey() > 10) {if (fz < kv.getValue() || (fz == kv.getValue() && ans < kv.getKey())) {fz = kv.getValue();ans = kv.getKey();}}}return ans;}}

T4. 统计前后缀下标对 II

思路: 字典树+z函数

因为涉及到前后缀一致的问题

所以必然需要引入

  • z函数
  • stringhash

这类技巧

有涉及到前缀问题,自然就引出字典树

class Solution {static int[] zFunction(String a) {char[] s = a.toCharArray();int n = s.length;int[] z = new int[n];z[0] = n;for (int i = 1, l = 0, r = 0; i < n; ++i) {if (i <= r && z[i - l] < r - i + 1) {z[i] = z[i - l];} else {z[i] = Math.max(0, r - i + 1);while (i + z[i] < n && s[z[i]] == s[i + z[i]]) ++z[i];}if (i + z[i] - 1 > r) {l = i;r = i + z[i] - 1;}}return z;}static class Trie {Trie[] cs = new Trie[26];int rel;void add(String w) {Trie cur = this;for (char c: w.toCharArray()) {int p = c - 'a';if (cur.cs[p] == null) {cur.cs[p] = new Trie();}cur = cur.cs[p];}cur.rel++;}int count(String w) {Trie cur = this;int[] zz = zFunction(w);int res = 0;int n = w.length();for (int i = 0; i < n; i++) {int p = w.charAt(i) - 'a';if (cur.cs[p] == null) {return res;}cur = cur.cs[p];if (zz[n - 1 - i] == i + 1) {res += cur.rel;}}return res;}}public long countPrefixSuffixPairs(String[] words) {long res = 0;Trie root = new Trie();for (String w: words) {res += root.count(w);root.add(w);}return res;}}

写在最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/475458.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时&#xff0c;考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面&#xff0c;就针对这三种思路具体看看有哪些优化…

学习Android的第十六天

目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorH…

⭐北邮复试刷题589. N 叉树的前序遍历__DFS (力扣每日一题)

589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

⭐北邮复试刷题LCR 012. 寻找数组的中心下标__前缀和思想 (力扣119经典题变种挑战)

LCR 012. 寻找数组的中心下标 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为…

Linux第61步_“buildroot”构建根文件系统第3步_烧写根文件系统到EMMC中_并完善开发板配置

烧录到EMMC测试&#xff0c;还需进一步测试和配置。 1、删除rootfs”目录下的“rootfs.tar”压缩包 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换到“linux”目录 输入“ls回车”&#xff0c;列出“linux”目录下的文件和文件夹 输入“cd nfs/回…

vue的生命周期图解

vue的生命周期图解 添加链接描述 vue的生命周期函数及过程的简述&#xff1a; vue的生命周期函数&#xff0c;其实就是vm的生命周期&#xff1b; 创建&#xff1a;beforeCreate、created 挂载&#xff1a;beforeMount、mounted 更新&#xff1a;beforeUpdate、updated [ˌʌpˈ…

Anaconda虚拟环境管理:指令总结!

哈喽大家好&#xff0c;我是chowley&#xff0c;这次来记录一个经典问题——python虚拟环境咋配&#xff1f; 当我们需要在同一台机器上同时运行多个项目时&#xff0c;经常会遇到Python环境不兼容的问题。比如&#xff0c;一个项目需要Python 2.7&#xff0c;而另一个项目需要…

RAG 排坑指南001——文档解析

序言 RAG搜索增强是一个极其简单的概念。简而言之就是将搜索召回的内容&#xff0c;送给模型润色&#xff0c;重新生成更好的答案。看似简单&#xff0c;实际做起来&#xff0c;就极其的复杂。想要做个演示demo也很简单&#xff0c;复杂的是如何把回答正确率提升到90以…

MOS管故障排查(G极电阻篇)

我们经常看到&#xff0c;在电源电路中&#xff0c;功率MOS管的G极经常会串联一个小电阻&#xff0c;几欧姆到几十欧姆不等&#xff0c;那么这个电阻用什么作用呢&#xff1f; 如上图开关电源&#xff0c;G串联电阻R13这个电阻的作用有2个作用&#xff1a;限制G极电流&#x…

在 CentOS 平台下安装与配置 MySQL 5.7.36

CentOS平台常用有三种MySQL安装方式&#xff0c;即RPM安装包、二进制压缩包和源码包。一般来讲&#xff0c;建议使用二进制压缩包&#xff0c;因为该版本比其他的分发版使用起来要简单灵活。本次实验在 CentOS 7.6 平台上选用二进制压缩包安装方式。 1、清理MySQL安装环境 Cent…

【C++杂货铺】string详解

目录 1. 基本概念&#xff1a; 1.1 本质&#xff1a; 1.2 string和char*区别&#xff1a; 1.3 特点&#xff1a; 2. 构造函数(初始化) 3. 赋值操作 4. 字符串拼接 5 查找 和 替换 6. 字符串比较 7. 字符存取 8. 插入和删除 ​9. 子串获取 &#x1f308;前言&#x…

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…