Leecode刷题C++之形成目标字符串需要的最少字符串数①
执行结果:通过
执行用时和内存消耗如下:
代码如下:
class Solution {
public:int minValidStrings(vector<string>& words, string target) {auto prefix_function = [](const string& word, const string& target) -> vector<int> {string s = word + '#' + target;int n = s.size();vector<int> pi(n, 0);for (int i = 1; i < n; i++) {int j = pi[i - 1];while (j > 0 && s[i] != s[j]) {j = pi[j - 1];}if (s[i] == s[j]) {j++;}pi[i] = j;}return pi;};int n = target.size();vector<int> back(n, 0);for (const string& word : words) {vector<int> pi = prefix_function(word, target);int m = word.size();for (int i = 0; i < n; i++) {back[i] = max(back[i], pi[m + 1 + i]);}}vector<int> dp(n + 1, 0);for (int i = 1; i <= n; i++) {dp[i] = 1e9;}for (int i = 0; i < n; i++) {dp[i + 1] = dp[i + 1 - back[i]] + 1;if (dp[i + 1] > n) {return -1;}}return dp[n];}
};
解题思路:
这段代码的目的是为了解决一个特定的问题:给定一个字符串数组 words 和一个目标字符串 target,找出最小的字符串数量,使得从这些字符串中选取若干(可以重复选取)并按任意顺序拼接起来,能够形成一个新的字符串,这个新字符串包含 target 作为其子串,并且新字符串中不包含任何除 target 之外的字符。如果无法形成这样的字符串,则返回 -1。
解题思路可以分为以下几个步骤:
- 定义前缀函数(
prefix_function):- 这个函数用于计算一个单词
word和目标字符串target的最长相同前缀后缀数组(也称为部分匹配表或 π 表)。 - 它通过将
word和target连接,并在中间插入一个特殊字符(如#),来避免word和target的重叠部分在计算时被误认为是匹配部分。 - 然后,它使用 KMP(Knuth-Morris-Pratt)算法的核心逻辑来计算这个 π 表。
- 这个函数用于计算一个单词
- 计算每个单词相对于
target的最大可重叠后缀长度:- 对于
words数组中的每个单词,使用前缀函数计算其与target的 π 表。 - 对于每个单词,通过 π 表找到从单词末尾开始,能与
target开头最大匹配的长度,并更新一个back数组,该数组记录了在每个target的位置上,通过某个单词能匹配的最大长度。
- 对于
- 动态规划求解最小字符串数量:
- 使用一个动态规划数组
dp,其中dp[i]表示形成长度为i的target子串所需的最小字符串数量。 - 初始化
dp数组,除了dp[0](形成空字符串需要 0 个字符串)之外,其他都设置为一个非常大的数(这里用1e9),表示当前无法形成。 - 遍历
target的每个位置,使用back数组的信息更新dp数组。具体来说,如果能够通过前面的某些字符串匹配掉target的前back[i]个字符,则形成长度为i+1的子串所需的最小字符串数量等于形成长度为i+1-back[i]的子串所需的最小数量加 1。 - 如果在任何时候
dp[i+1]的值超过了target的长度,说明无法通过拼接形成完整的target,返回-1。
- 使用一个动态规划数组
- 返回结果:
- 遍历完成后,
dp[n](其中n是target的长度)就是形成完整target所需的最小字符串数量。
- 遍历完成后,
相关文章:
Leecode刷题C++之形成目标字符串需要的最少字符串数①
执行结果:通过 执行用时和内存消耗如下: 代码如下: class Solution { public:int minValidStrings(vector<string>& words, string target) {auto prefix_function [](const string& word, const string& target) -> vector<…...
Linux应用开发————mysql数据库
数据库概述 什么是数据库(database)? 数据库是一种数据管理的管理软件,它的作用是为了有效管理数据,形成一个尽可能无几余的数据集合,并能提供接口,方便用户使用。 数据库能用来干什么? 顾名思义,仓库就是用来保存东…...
4_使用 HTML5 Canvas API (3) --[HTML5 API 学习之旅]
4_使用 HTML5 Canvas API (3) --[HTML5 API 学习之旅] 1.缩放 canvas 对象 在 <canvas> 中缩放对象可以通过 scale 方法来实现。这个方法会根据提供的参数对之后绘制的所有内容进行缩放。下面是两个具体的示例,展示如何使用 scale 方法来缩放 canvas 上的对…...
docker build次数过多,导致磁盘内存不足:ERROR: no space left on device
在使用 docker build 构建镜像时,Docker 会创建一个临时的构建上下文,生成镜像的过程中会产生多个中间层。这些文件和层会占用磁盘空间。构建完成后,如果你没有清理这些不再使用的中间层和临时文件,可能会导致磁盘空间不足。 常见…...
LDO和DC-DC的区别、DCDC和LDO主要指标
LDO和DC-DC的区别 LDO外围器件少,电路简单,成本低;DC-DC外围器件多,电路复杂,成本高; LDO负载响应快,输出纹波小;DC-DC负载响应比LDO慢,输出纹波大; LDO效…...
LeetCode hot100-81
https://leetcode.cn/problems/climbing-stairs/description/?envTypestudy-plan-v2&envIdtop-100-liked 70. 爬楼梯 已解答 简单 相关标签 相关企业 提示 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&…...
RTMP、RTSP、RTP、HLS、MPEG-DASH协议的简介,以及应用场景
实时视频传输协议 1. RTMP(Real Time Messaging Protocol) 简介:RTMP是由Adobe公司开发的实时消息传输协议,主要用于流媒体数据的传输。它基于TCP传输,具有低延迟、高可靠性的特点。特点:RTMP支持多种视…...
力扣-图论-15【算法学习day.65】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
“AI智慧数字孪生系统:开启智能新纪元
嘿,大家好!今天我想和大家聊聊一个特别酷炫的话题——AI智慧数字孪生系统。这可是个新鲜玩意儿,可能有些朋友还不太了解,别急,我来慢慢道来。 首先,啥叫数字孪生呢?简单来说,就是给现…...
54、库卡机器人轴的软限位设置
步骤1:将用户组改为“专家”。 步骤2:点击“投入运行”----“售后服务”-----“软件限位开关” 步骤3:就可以针对每个轴修改对应的角度值,然后点击“保存”。...
基于MATLAB 的数字图像处理技术总结
大家好!欢迎来到本次的总结性的一篇文章,因为咸鱼哥这几个月是真的有点小忙(参加了点小比赛,准备考试等等)所以,在数字图像学习后,我来写一个总结性的文章,同时帮助大家学习…...
Android运行低版本项目可能遇到的问题
Android运行低版本项目可能遇到的问题 低版本项目总是遇到各种问题的,耐心点 一、gradle-xxx.xxx.xxx.zip一直下载不下来 在gradle-wrapper.properties可以试下 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME …...
window.getSelection() 获取划线内容并实现 dom 追随功能
功能:鼠标对一段文本中某些文字进行划线之后,需要在当前划线文本处出现一个功能按钮显示对划线内容进行操作,比如收藏、添加样本库等功能。 一、需要了解的鼠标事件对象属性 给 dom 元素注册鼠标事件之后,会有 event 属性&#…...
【人工智能】基于Python的自然语言处理:深入实现文本相似度计算
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 文本相似度计算是自然语言处理(NLP)中的核心任务,广泛应用于搜索引擎、推荐系统、问答系统等领域。本文全面解析文本相似度计算的核心技术,使用Python中的spaCy和sentence-transformers库实现多种方法,包括基…...
布局、组成部分
布局 线性布局 (Row/Column) 线性容器Row和Column构建,Column容器内子元素按照垂直方向排列,Row容器内子元素按照水平方向排列。 在布局容器内,可以通过space属性设置排列方向上子元素的间距,使各子元素在排列方向上有等间距效…...
Go, Jocko, Kafka
本篇内容是根据2016年8月份# 31. Go, Jocko, Kafka 音频录制内容的整理与翻译 Travis Jeffery 参加了节目,谈论 Go、Jocko、Kafka、Kafka 的存储内部结构如何工作,以及有趣的 Go 项目和新闻。 Erik St. Martin: 大家好,欢迎回到《GoTime》的另…...
CANoe 报文仿真
文章目录 一、单个/少数报文仿真1、Canoe 发送报文2、可以自定义该报文发送节点3、添加报文4、触发方式 二、ECU节点仿真1、导入DBC,添加节点2. 选择节点中的哪些报文可以发送3. 更新ECU 节点发送的报文数据 三、开始仿真激活/失效该 ECU节点 一、单个/少数报文仿真…...
升级thinkphp8最新版本,升级后发现版本不变
升级thinkphp8.0.3最新版本8.1.1,升级后发现版本不变, 更新TP有两个方法 1 全部更新(所有插件都一起更新) composer update 2 只更新TP框架核心 composer update topthink/framework 造成可能有两个原因,一是缓存问题,二是更新…...
工业大数据分析算法实战-day07
文章目录 day07概率图模型朴素贝叶斯(Naive Bayes)贝叶斯网络(Bayesian Network)一般图模型生成式和判别式模型图模型结构与模型推理 集成学习Boosting算法Stacking算法 day07 今天是第七天,昨日主要针对是第三章节中…...
六、nginx负载均衡
负载均衡:将四层或者七层的请求分配到多台后端的服务器上。 从而分担整个业务的负载。提高系统的稳定性,也可以提高高可用(备灾,其中一台后端服务器如果发生故障不影响整体业务). 负载均衡的算法 round robin 轮询 r…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  二、核心功能实现 1. 医院科室展示 /…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
