力扣 第 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;
    }

}

写在最后

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

D3842——三极管驱动,专为脱线和Dc-Dc开关电源应用设计的,起动电流小

D3842/43/44是专为脱线和Dc-Dc开关电源应用设计的恒频电流型Pwd控制器内部包含温度补偿精密基准、供精密占空比调节用的可调振荡器、高增益混放大器、电流传感比较器和适合作功率MOST驱动用的大电流推挽输出颇以及单周期徊滞式限流欠压锁定、死区可调、单脉冲计数拴锁等保护电路…

【RL】Monte Carlo Learning(蒙特卡洛学习)

Lecture 5: Monte Carlo Learning The simplest MC-based RL algorithm: MC Basic 理解MC basic算法的关键是理解如何将policy iteration算法迁移到model-free的条件下。 Policy iteration算法在每次迭代过程中有两步&#xff1a; { Policy evaluation: v π k r π k γ…

山西电力市场日前价格预测【2024-02-16】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-16&#xff09;山西电力市场全天平均日前电价为55.97元/MWh。其中&#xff0c;最高日前电价为314.75元/MWh&#xff0c;预计出现在18:45。最低日前电价为0.00元/MWh&#xff0c;预计出现…

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda管理python库 不太推荐 pyenv管理Python不同版本教程&#xff08;本人另一篇博客&#xff0c;姊妹篇&#xff09; 0.前提 ①anaconda、miniconda&#xff08;2个的下载仓库&#xff09;在win上推荐前者&a…

为什么将二维码分解成文字? 二维码在线转文字的方法

将二维码分解成文字的主要目的是为了方便人们获取二维码中的信息便于使用。二维码是一种由黑白方块组成的图案&#xff0c;可以存储大量的数据&#xff0c;如网址、联系方式、产品信息等。然而&#xff0c;对于一些特定的场景或个人需求&#xff0c;无法直接扫描二维码。因此&a…

ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection

ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…

vue的生命周期图解

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

数字化转型导师坚鹏:数字化思维创新与BLM政府数字化转型战略

数字化思维创新与BLM政府数字化转型战略 ——以BLM模型为核心&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多政府存在以下问题&#xff1a; 不知道如何系统地开展数字化转型工作&#xff1f; 不清楚如何高效地执行数字化转型战略&a…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言&#xff1a;OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先&#xff0c;很多博主都介绍过Sora&#xff0c;但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(3)数据准备初步

今天来学习数据准备。 一个AI项目要包括构建数据集、数据清理和数据融合、数据采集、特征工程、算法改进和其他步骤。 数据采集和数据清洗&#xff0c;也就是数据准备&#xff0c;要占到人工智能项目一半以上的工作量。 训练的数据量越大&#xff0c;模型越准确。 建立数据标…

php 函数(方法)、日期函数

php 函数、日期函数 1. php函数2. 日期函数 1. php函数 <?php// 创建一个函数 function hello($who) {echo $who.Hello World!; }hello("老张");给参数一个默认值&#xff0c;当然自己有变量走自己的 2. 日期函数 <?php/** date(Y-m-d H:i:s)返回的时间是…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

文件上传漏洞--Upload-labs--Pass06--空格绕过

一、什么是空格绕过 在Windows系统中&#xff0c;Windows特性会自动删除文件后缀名后的空格&#xff0c;这使我们看 .php 和 .php 二者没有任何区别&#xff0c;实际上二者是有区别的。若网页源码没有使用 trim()函数 来进行去除空格的操作&#xff0c;就会使网页存在 空格绕…

x86使用内敛汇编实现简单的临界段保护

临界资源保护 实现方法 禁用中断 __attribute__((used)) static inline uint32_t read_eflags (void){uint32_t eflags;ASM_V("pushf\n\tpop %%eax":"a"(eflags));return eflags; } __attribute__((used)) static inline void write_eflags (uint32_t e…

蓝桥杯官网填空题(寻找整数)

问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^17 的正整数 n&#xff0c;知道这个数除以 2 至 49 后的余数如下表所示&#xff0c;求这个正整数最小是多少。 运行限制 最大运行时间&#xff1a;…

搭建游戏服务器需要高防御的服务器吗?

随着网络技术的不断发展&#xff0c;游戏行业也迎来了前所未有的发展机遇。然而随着游戏用户的不断增加&#xff0c;游戏服务器的安全问题也日益突出。一些攻击者可能会对游戏服务器进行攻击&#xff0c;例如DDoS攻击、CC攻击等&#xff0c;导致服务器无法正常运行&#xff0c;…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

8.8 矢量图层点要素点聚合(Point cluster)使用

文章目录 前言点聚合&#xff08;Point cluster&#xff09;QGis代码实现 总结 前言 本章介绍如何使用点聚合&#xff08;Point cluster&#xff09;说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 点聚合&#xff08;Point cluster&#xff09; 点要素过…

实例讲解join方法的使用

Python的join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串 语法 str.join(sequence) 参数 sequence 要连接的元素序列、字符串、元组、字典 返回值 返回通过指定字符连接序列中的元素后生成的新的字符串 实例 str "-"; seq ("a"…

Facebook MarketPlace自养号测评在海外FB商城如何精准引流私域?(上)

2024直击痛点&#xff1a;Facebook MarketPlace 如何引流裂变 (Facebook商城)? “Facebook MarketPlace&#xff08;FB商城&#xff09;、Instagram、Whatsapp、Twitter、Reddit、Youtube、Line、VK等怎样超低成本进行海外精准获客&#xff08;引流&#xff09;”&#xff0c…