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…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...