LeetCode 第415场周赛个人题解

目录

Q1. 数字小镇中的捣蛋鬼

原题链接

思路分析

AC代码

Q2. 最高乘法得分

原题链接

思路分析

AC代码

Q3. 形成目标字符串需要的最少字符串数 I

原题链接

思路分析

AC代码

Q4. 形成目标字符串需要的最少字符串数 II

原题链接

思路分析

AC代码


Q1. 数字小镇中的捣蛋鬼

原题链接

Q1. 数字小镇中的捣蛋鬼

思路分析

签到题

AC代码

class Solution:def getSneakyNumbers(self, nums: List[int]) -> List[int]:cnt = Counter(nums)return [x for x in set(nums) if cnt[x] == 2]

Q2. 最高乘法得分

原题链接

Q2. 最高乘法得分

思路分析

划分型dp

定义状态f(i, j) 为 b 前 i 个数 和 a 前 j 个数匹配的最大得分

那么 f(i + 1, j) = max{f(i, j), f(i, j - 1) + a[j - 1] * b[j]}

时间复杂度O(4len(b))

AC代码

class Solution:def maxScore(self, a: list[int], b: list[int]) -> int:n = len(b)f = [[-inf] * 5 for _ in range(n + 1)]f[0][0] = 0for i in range(n):f[i + 1][0] = 0for j in range(1, 5):f[i + 1][j] = max(f[i + 1][j], f[i][j - 1] + a[j - 1] * b[i], f[i][j])return max(f[i][4] for i in range(n + 1))

Q3. 形成目标字符串需要的最少字符串数 I

原题链接

Q3. 形成目标字符串需要的最少字符串数 I

思路分析

见Q3

AC代码

auto FIO = []{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);return 0;
}();constexpr int inf = 1e9;
struct AhoCorasick {static constexpr int ALPHABET = 26;struct Node {int len = 0;int fail = 0;array<int, ALPHABET> son;int last = 0;Node() : son{} {}};vector<Node> tr;AhoCorasick() {init();}void init() {tr.reserve(5000);tr.assign(2, Node());tr[0].son.fill(1);tr[1].last = 1;}int newNode() {tr.emplace_back();return tr.size() - 1;}void add(const string& s) {int p = 1, i = 1;for (char ch : s) {int x = ch - 'a';if (!tr[p].son[x])tr[p].son[x] = newNode();p = tr[p].son[x];tr[p].len = i ++;}}void build() {queue<int> q;q.push(1);while (q.size()) {int x = q.front();q.pop();for (int i = 0; i < ALPHABET; ++ i) {if (!tr[x].son[i]) {tr[x].son[i] = tr[tr[x].fail].son[i];continue;}tr[tr[x].son[i]].fail = tr[tr[x].fail].son[i];tr[tr[x].son[i]].last = tr[tr[tr[x].son[i]].fail].len ? tr[tr[x].son[i]].fail : tr[tr[tr[x].son[i]].fail].last;q.push(tr[x].son[i]);}}}int son(int p, int x) {return tr[p].son[x];}int fail(int p) {return tr[p].fail;}int last(int p) {return tr[p].last;}int len(int p) {return tr[p].len;}int size() {return tr.size();}
};class Solution {
public:int minValidStrings(vector<string>& words, string target) {int m = words.size(), n = target.size();AhoCorasick ac;for (auto &s : words) ac.add(s);ac.build();vector<int> f(n + 1, inf);f[0] = 0;int cur = 1;for (int i = 1; i <= n; ++ i) {cur = ac.son(cur, target[i - 1] - 'a');if (ac.len(cur))f[i] = min(f[i], f[i - ac.len(cur)] + 1);}return f[n] == inf ? -1 : f[n];}
};

Q4. 形成目标字符串需要的最少字符串数 II

原题链接

Q4. 形成目标字符串需要的最少字符串数 II

思路分析

AC自动机+dp

一个很暴力的思路就是把所有前缀都存AC自动机里面,然后在AC自动机上匹配target来进行dp

和3213. 最小代价构造字符串做法一样

但是存所有前缀会爆掉,我们修改一下AC自动机的插入,对于一个单词的插入,路径上的节点都是一个单词结尾

这样我们看似只插入了每个单词,实际上我们插入了每个单词的所有前缀

定义状态 f(i) 为 构造target 前 i 个字符所需最少字符串数

当前匹配到i,对应自动机节点为cur,那么转移方程为:

f(i) = min{f[i], f[i - ac.len(cur)] + 1}

为什么呢?不应该匹配所有前缀吗?

事实上,如果target可以构造,事实上存在合法构造,下图一定存在若干不相交的线段覆盖整个区间那么我们把target当成一个文本串,我们可以在上面匹配出所有target包含的是自动机中单词的子串,而我们每次跳fail指针,都是跳最长后缀

如果存在多组覆盖整个区间的不相交线段组,我们一定会走线段数最少的那一条

事实上,多组合法覆盖一定是相交的,我们假如正走在一条非最优解路径,到达一条线段的结束的时候我们自然会往最优解路径的方向去跳

这个过程可以手玩一下来加深理解

时间复杂度O(Σlen(words[i]))

AC代码

auto FIO = []{std::ios::sync_with_stdio(false);std::cin.tie(nullptr);return 0;
}();constexpr int inf = 1e9;
struct AhoCorasick {static constexpr int ALPHABET = 26;struct Node {int len = 0;int fail = 0;array<int, ALPHABET> son;int last = 0;Node() : son{} {}};vector<Node> tr;AhoCorasick() {init();}void init() {tr.reserve(5000);tr.assign(2, Node());tr[0].son.fill(1);tr[1].last = 1;}int newNode() {tr.emplace_back();return tr.size() - 1;}void add(const string& s) {int p = 1, i = 1;for (char ch : s) {int x = ch - 'a';if (!tr[p].son[x])tr[p].son[x] = newNode();p = tr[p].son[x];tr[p].len = i ++;}}void build() {queue<int> q;q.push(1);while (q.size()) {int x = q.front();q.pop();for (int i = 0; i < ALPHABET; ++ i) {if (!tr[x].son[i]) {tr[x].son[i] = tr[tr[x].fail].son[i];continue;}tr[tr[x].son[i]].fail = tr[tr[x].fail].son[i];tr[tr[x].son[i]].last = tr[tr[tr[x].son[i]].fail].len ? tr[tr[x].son[i]].fail : tr[tr[tr[x].son[i]].fail].last;q.push(tr[x].son[i]);}}}int son(int p, int x) {return tr[p].son[x];}int fail(int p) {return tr[p].fail;}int last(int p) {return tr[p].last;}int len(int p) {return tr[p].len;}int size() {return tr.size();}
};class Solution {
public:int minValidStrings(vector<string>& words, string target) {int m = words.size(), n = target.size();AhoCorasick ac;for (auto &s : words) ac.add(s);ac.build();vector<int> f(n + 1, inf);f[0] = 0;int cur = 1;for (int i = 1; i <= n; ++ i) {cur = ac.son(cur, target[i - 1] - 'a');if (ac.len(cur))f[i] = min(f[i], f[i - ac.len(cur)] + 1);}return f[n] == inf ? -1 : f[n];}
};

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

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

相关文章

数据库全攻略:从类型到安全与优化

数据库全攻略&#xff1a;从类型到安全与优化 一、数据库类型大观 &#xff08;一&#xff09;关系型数据库 关系型数据库以表格形式存储数据&#xff0c;通过 SQL 语言进行操作&#xff0c;数据之间存在关联关系&#xff0c;适合复杂查询和事务处理。常见的关系型数据库有 …

springboot瑜伽课约课小程序-计算机毕业设计源码87936

摘要 本文详细阐述了一个基于SpringBoot框架的瑜伽课约课小程序的设计与实现过程。随着现代生活节奏的加快&#xff0c;越来越多的人开始关注身心健康&#xff0c;瑜伽作为一种集健身、放松、减压于一体的运动方式&#xff0c;受到了广泛的欢迎。为满足瑜伽爱好者的课程预约和学…

Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux

Ubuntu 22.04.5 LTS (Jammy Jellyfish) - 现代化的企业与开源 Linux Ubuntu 22.04.5 发布&#xff0c;配备 Linux 内核 6.8 请访问原文链接&#xff1a;https://sysin.org/blog/ubuntu-2204/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

Recyclerview实现滑动居中缩放菜单

最近项目中需要的一个滑动菜单效果:要求当前居中选项放大、滑动时有缩放效果、点击两边的选项滑动到屏幕中央、停止滑动选项停留在屏幕中间(类似viewPager的效果),为了直观,先上最终实现效果图: 大体思路: Recyclerview item头尾添加空数据,让第一个和最后一个item也能…

c++题目_【模板】最小生成树Prim

题目描述 这是一道最小生成树Prim的模板题&#xff0c;本题与【模板】最小生成树Kruskal&#xff0c;仅仅只有nn和mm的大小不同 给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入 第一行输入2个正整数n,mn,m&#xff0c;代表…

数据可视化pyecharts——数据分析(柱状图、折线图、饼图)

安装 首先确保已经安装了pyecharts库&#xff0c;如果没有&#xff0c;可以通过pip install pyecharts进行安装。 柱状图 从pyecharts.charts导入Bar&#xff0c;从pyecharts导入options。准备数据&#xff08;如类别数据x_data和对应的数值数据y_data&#xff09;。创建Bar对…

解决win11 使用wsl工具,不能使用systemctl

使用systemctl命令出现报错&#xff1a; System has not been booted with systemd as init system (PID 1). Can‘t operate. 默认情况下并不启用 systemd&#xff0c;而是使用了其他轻量级的初始化系统&#xff08;SysV init初始化系统&#xff09;。这导致一些需要 system…

力扣最热一百题——螺旋矩阵

目录 题目链接&#xff1a;54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;模拟 1. 边界初始化 2. 循环遍历矩阵 3. 从左到右遍历上边界 4. 从上到下遍历右边界 5. 从右到左遍历下边界 6. 从下到上遍历左边…

【GPU版】Windows下PyTorch入门深度学习环境安装与配置

如果电脑有NVIDIA GPU显卡&#xff0c;看【GPU版本】&#xff1b;否则&#xff0c;看【CPU版本】 聊聊PyTorch和Tensorflow 它们都是python的库/包 pip3是给python3使用的&#xff0c;由于现在用的python基本上都是3以上版本&#xff0c;所以pip和pip3没有区别 聊聊Anacond…

DNC Server 开发

每个工厂里面的机床系统类型各式各样,程序传输DNC 功能可以提高技术人员的工作效率,怎样兼容每种系统是个难题,如果是做工厂信息化的工程师也是比较头疼,下面给出一个解决方案,抛砖引玉 我们可以使用一种框架 满足插件式开发,主程序负责管理插件,具体的上传 下载 删除 查询等具…

第108集《大佛顶首楞严经》

请打开讲义241面。我们讲到嗅报&#xff0c;鼻根当中嗅的功能。 本根发相 发明二相&#xff1a;一者通闻&#xff0c;被诸恶气&#xff0c;熏极心扰。二者塞闻&#xff0c;气掩不通&#xff0c;闷绝于地。 以鼻根造业到无间地狱以后&#xff0c;他有二种受苦的相状&#xf…

Java数据结构——Set和Map

掌握 Map/Set 及实际实现类 HashMap/TreeMap/HashSet/TreeSet 的使用。掌握 TreeMap 和 TreeSet 背后的数据结构搜索树的原理和简单实现。掌握 HashMap 和 HashSet 背后的数据结构哈希表的原理和简单实现。 目录 1.搜索 1.1概念及场景 1.2模型 2. Map的使用 2.1关于Map的说…

【5G QoS】详解5G QoS端到端工作机制

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

同城找搭子小程序有哪些?找搭子社交软件测评笔记分享

寻找搭子不再迷茫&#xff01;今日测评几款热门找搭子小程序&#xff0c;为你开启全新社交体验。真实体验&#xff0c;深度剖析&#xff0c;帮你找到最适合的搭子平台&#xff0c;快来一探究竟。 1. 咕哇找搭子小程序&#xff1a;这是一个实名制的找搭子交友平台。正是由于实名…

力扣(leetcode)每日一题 2848 与车相交的点

2848. 与车相交的点 - 力扣&#xff08;LeetCode&#xff09; 题干 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终…

四款好用英语翻译工具的全面指南

对于经常需要与工作或学习相关的英语资料打交道的人来说&#xff0c;翻译工具成为了我们日常的得力助手;现在市场上的英语翻译工具琳琅满目&#xff0c;各有千秋;今天&#xff0c;我就来为大家推荐几款我个人觉得非常实用的翻译工具: 第一款&#xff1a;福昕在线翻译 说到这一…

关于wp网站出现的问题

问题1 问题1&#xff1a;如果出现这个界面的问题 说明是根目录的index.php编码出了问题&#xff0c;用备份的源文件退换一下即可。 问题2 问题2&#xff1a;如果出现页面错位现象&#xff0c;可能是某个WP插件引起的问题&#xff0c;这里需要逐步排查插件&#xff0c;或者你刚…

【计算机网络 - 基础问题】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

echo 命令:终端输出文本

一、echo 命令简介 ​echo​命令用于在终端上打印简单的文本消息、变量值或者将文本输出到文件中。 ‍ ​echo​ 命令在脚本编写、简单调试和显示信息时非常有用。可以用来输出状态信息、变量值或者作为其他命令的输入。 ‍ 相关命令&#xff1a;printf 命令比 echo 命令提…

数据可视化与分析:数据时代的关键工具

一、引言 数据可视化与分析是大数据时代中最为重要的技术之一。随着数据量的不断增加&#xff0c;如何有效地理解、解释和利用数据&#xff0c;已经成为各行各业面临的关键挑战。数据可视化通过图表、图形和互动界面将数据以直观的方式呈现&#xff0c;帮助用户快速识别数据中…