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

news2025/1/22 16:10:05

前言

在这里插入图片描述


整体评价

这是一场字典树专场,除了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.coloradmin.cn/o/1454765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

沁恒CH32V30X学习笔记03--64位systick

systick CH32F2x 系列产品Cortex-M3 内核自带了一个 24 位自减型计数器(SysTick timer)。支持 HCLK 或 HCLK/8 作为时基,具有较高优先级别(6)。一般可用于操作系统的时基。 CH32V3x 系列产品内核自带了一个 64 位加减计数器(SysTick),支持 HCLK 或者 HCLK/8 作为时基,…

VQ30 广告点击的高峰期(order by和limit的连用)

代码 select hour(click_time) as click_hour ,count(hour(click_time)) as click_cnt from user_ad_click_time group by click_hour order by click_cnt desc limit 1知识点 order by和limit的连用&#xff0c;取出所需结果 YEAR() 返回统计的年份 MONTH() 返回统计的月份 D…

【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

【C语言】实现栈

目录 &#xff08;一&#xff09;栈 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09; 栈的销毁 &#xff08;3&#xff09;压栈 &#xff08;4&#xff09; 出栈 &#xff08;5&a…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享&#xff0c;乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式&#xff0c;可以按单价&#xff0c;也可以按时间段 可…

VR直播:只需五步,即可实现直播“黑科技”

现如今&#xff0c;VR直播的应用范围较为广泛&#xff0c;有很多人可能在现场见过VR直播的拍摄设备&#xff0c;不仅有高性能的电脑、VR相机&#xff0c;还有专业的灯光和拍摄机器等。只需要五步&#xff0c;就可以实现安全、高效的VR全景直播。 首先是专业全景采集设备进行全景…

用纯HTML写一个凭证并打印

最近有个需求&#xff0c;需要通过网页把单子打印出来&#xff0c;就用html实现了一个&#xff0c;主要使用了windwos自带的print打印&#xff0c;全部代码如下&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" cont…

Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

文章目录 前言原因分析解决方案方案1&#xff1a;手动设置线程中的认证信息方案2&#xff1a;使用DelegatingSecurityContextRunnable创建线程方案3&#xff1a;修改Spring Security安全策略通过设置JVM参数修改安全策略通过SecurityContextHolder修改安全策略 总结 前言 近日…

Mysql开启bin-log日志

目录 一、安装配置 二、mysqlbinlog命令 一、安装配置 yum -y install mariadb mariadb-server#安装mysql数据库#默认配置文件/etc/my.cnfvim /etc/my.cnflog-binmariadb-bin #开启二进制日志 systemctl restart mariadb#会在/car/lib/mysql/产生二进制日志文件&#xff0…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇]

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇] 引言相关环境技术栈初始化工程安装turbo配置pnpm-workspace安装husky安装lint-staged安装eslint安装prettier配置 .editorconfig配置 .gitignore初步项目结构结语 引言 最近各种原因&#xff0c;生活上的&am…

【C++初阶】值得一刷的字符串string相关oj题

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

二.重新回炉Spring Framework:Spring Framework主要组件概览

1.写在前面的话 这里主要简单说一下Spring Framework的几个核心组件的总体情况。为了比较直观&#xff0c;这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示&#xff1a; 2.Resource 组件体系 R…

项目管理软件品牌榜:行业领导者与热门选择

大数据、人工智能等新兴技术的崛起&#xff0c;各种行业在数字化转型的过程中&#xff0c;越来越注重有效的项目管理和协作方式。而各种项目管理软件应运而生&#xff0c;以帮助企业提高效率、降低成本、提高协作性。然而在众多的项目管理软件市场上&#xff0c;如何选择适合自…

PCIe TX端电容

一、问题&#xff1a;PCIe为什么要加电容 PCIe为什么要加电容&#xff1f;具体的作用是什么&#xff1f; 答&#xff1a;因为PCIe Host和Receiver两端的直流偏置会不一样&#xff0c;所以需要在PCIe的传输路径上加电容&#xff0c;这样传输路径上只有AC信号&#xff0c;不存在…

小白如何学鸿蒙开发?

在互联网技术不断发展的现在&#xff0c;鸿蒙操作系统的出现标志着是能技术领域的一次重大突破&#xff0c;鸿蒙作为华为推出的一代操作系统&#xff0c;鸿蒙不仅达代表了自主创新的力量&#xff0c;还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善…

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【C++】类与对象【定义、访问限定符、this指针】

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 面向过程和面向对象初步认识 类的引入 类的定义 成员变量命名规则的建议&#xff1a; 类的访问限定符及…

代码随想录刷题笔记 DAY 29 | 非递减子序列 No.491 | 全排列 No.46 | 全排列 II No. 47

文章目录 Day 2901. 非递减子序列&#xff08;No. 491&#xff09;1.1 题目1.2 笔记1.3 代码 02. 全排列&#xff08;No. 46&#xff09;2.1 题目2.2 笔记2.3 代码 03. 全排列 II&#xff08;No. 47&#xff09;3.1 题目3.2 笔记3.3 代码 Day 29 01. 非递减子序列&#xff08;…

Spring Boot打war包部署到Tomcat,访问页面404 !!!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 Spring Boot打war包部署到Tomcat&#xff0c;访问页面404 &#xff01;&#xff01;&#xff01;解决办法&#xff1a;检查Tomcat版本和Jdk的对应关系&#xff0c;我的Tomcat是6.x&#x…