给字符串添加加粗标签(AC自动机+Python)

可以暴力解决,但是为了锻炼一下ac自动机的编程,我们使用ac自动机。

ac自动机主要维护两个列表,一个列表ch,ch[f][idx]表示从父节点f向idx这个方向走,走到的节点。另一个列表nex,nex[i]表示节点i回跳边的节点。

from collections import defaultdict, deque
class Solution:def addBoldTag(self, s: str, words: List[str]) -> str:p = ''.join(words)n = len(p)n1 = len(s)r1 = []# ac自动机ch = defaultdict(dict)nex = [0]*(n+1)cnt = [0]*(n+1)idy = 0def assign(s):if s.isdigit():return int(s)elif ord('a') <= ord(s) <= ord('z'):return ord(s) - ord('a') + 10else:return ord(s) - ord('A') + 36def insert(word):f = 0nonlocal idyfor s in word:idx = assign(s)if idx not in ch[f]:idy += 1ch[f][idx] = idyf = idyelse:f = ch[f][idx]cnt[f] = len(word)def bulid():qu = deque()for i in range(62):if i not in ch[0]:continuequ.append(ch[0][i])while qu:f = qu.popleft()for i in range(62):if i not in ch[f]:ch[f][i] = 0 if i not in ch[nex[f]] else ch[nex[f]][i]else:nex[ch[f][i]] = 0 if i not in ch[nex[f]] else ch[nex[f]][i]qu.append(ch[f][i])def query(s):f = 0for i in range(n1):idx = assign(s[i])f = 0 if idx not in ch[f] else ch[f][idx]idy = fwhile idy != 0:if cnt[idy]:r1.append([i-cnt[idy]+1, i+1])breakidy = nex[idy]return for word in words:insert(word)bulid()query(s)r1.sort()leth = len(r1)if leth == 0:return srec = [r1[0]]for idx in range(1, leth):l, r = r1[idx]if l <= rec[-1][1]:rec[-1][1] = max(r, rec[-1][1])else:rec.append([l,r])dic = defaultdict(str)for l, r in rec:dic[l] = '<b>'dic[r] = '</b>'ans = ''for idx in range(n1):if dic[idx]:ans += dic[idx]ans += s[idx]if dic[n1]:ans += dic[n1]return ans

确实是通过了,但是!!!暴力解法居然比ac自动机更快!!!哪边出了问题???

下面是暴力的,上面是ac自动机

暴力代码:

class Solution:def addBoldTag(self, s: str, words: List[str]) -> str:from collections import defaultdictr1 = []l1 = len(s)for word in words:l2 = len(word)for idx in range(l1-l2+1):if s[idx:idx+l2] == word:r1.append([idx,idx+l2])r1.sort()leth = len(r1)if leth == 0:return srec = [r1[0]]for idx in range(1, leth):l, r = r1[idx]if l <= rec[-1][1]:rec[-1][1] = max(r, rec[-1][1])else:rec.append([l,r])dic = defaultdict(str)for l, r in rec:dic[l] = '<b>'dic[r] = '</b>'ans = ''for idx in range(l1):if dic[idx]:ans += dic[idx]ans += s[idx]if dic[l1]:ans += dic[l1]return ans

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

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

相关文章

01 【哈工大_操作系统】x86_64 常用寄存器大全

在学习CPU底层技术的时候&#xff0c;难免会接触到各式各样的寄存器。尤其是在使用汇编语言编写操作系统时&#xff0c;寄存器更是必不可少的。因此&#xff0c;这篇文章将来详细聊聊 x86_64 架构中的所有寄存器&#xff0c;按照从 常用->不常用 的顺序来进行介绍。 首先&a…

Spark-机器学习(4)回归学习之逻辑回归

在之前的文章中&#xff0c;我们来学习我们回归中的线性回归&#xff0c;了解了它的算法&#xff0c;知道了它的用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请…

Syncovery for Mac v10.14.3激活版:文件备份和同步工具

Syncovery for Mac是一款高效且灵活的文件备份与同步工具&#xff0c;专为Mac用户设计&#xff0c;旨在确保数据的安全性和完整性。该软件支持多种备份和同步方式&#xff0c;包括本地备份、网络备份以及云备份&#xff0c;用户可以根据实际需求选择最合适的方案。 Syncovery f…

信息系统项目管理师0062:需求分析(5信息系统工程—5.1软件工程—5.1.2需求分析)

点击查看专栏目录 文章目录 5.1.2需求分析1.需求的层次2.需求过程3.UML4.面向对象分析记忆要点总结5.1.2需求分析 软件需求是指用户对新系统在功能、行为、性能、设计约束等方面的期望。根据IEEE的软件工程标准词汇表,软件需求是指用户解决问题或达到目标所需的条件或能力,是…

【深度学习】烟雾和火焰数据集,野外数据集,超大量数据集,目标检测,YOLOv5

标注了2w张数据集&#xff0c;是目标检测yolo格式的&#xff0c;有火焰、烟雾两个目标。 训练方法看这里&#xff1a; https://qq742971636.blog.csdn.net/article/details/138097481 打包 依据不一样的需求&#xff0c; 详情请查看 https://docs.qq.com/sheet/DUEdqZ2l…

多元函数泰勒公式(含黑塞矩阵)

一元函数的泰勒公式&#xff1a; 接下来&#xff0c;由一元函数有关知识&#xff0c;我们有: 注意这里的dxn中&#xff0c;应把dx看作一个整体&#xff0c;即一个微小变量的n次方 我们接下来推导微分算子&#xff1a; 接下来&#xff0c;把一元泰勒公式转为微分形式: 对于二元…

React.js 3D开发快速入门

如果你对 3D 图形的可能性着迷&#xff0c;但发现从头开始创建 3D 模型的想法是不可能的 - 不用担心&#xff01; Three.js 是一个强大的 JavaScript 库&#xff0c;它可以帮助我们轻松地将现有的 3D 模型集成到 React 应用程序中。因此&#xff0c;在本文中&#xff0c;我将深…

ExcelVBA把当前工作表导出为PDF文档

我们先问问Kimi Excel导出为PDF的方法有多种&#xff0c;以下是一些常见的方法&#xff1a; 1 使用Excel软件的内置功能&#xff1a; 打开Excel文件&#xff0c;点击“文件”菜单。选择“另存为”&#xff0c;在“保存类型”中选择“PDF”。设置保存路径和文件名&#xff0c;点…

【机器学习】重塑汽车设计与制造:实例与代码探索

机器学习重塑汽车设计与制造 一、机器学习在汽车设计中的应用二、机器学习在智能制造与生产中的应用 在数字化浪潮的推动下&#xff0c;机器学习技术正逐步成为汽车行业的创新引擎。从概念设计到智能制造&#xff0c;机器学习正以其独特的优势助力汽车产业的革新与发展。本文将…

数据挖掘实验(Apriori,fpgrowth)

Apriori&#xff1a;这里做了个小优化&#xff0c;比如abcde和adcef自连接出的新项集abcdef&#xff0c;可以用abcde的位置和f的位置取交集&#xff0c;这样第n项集的计算可以用n-1项集的信息和数字本身的位置信息计算出来&#xff0c;只需要保存第n-1项集的位置信息就可以提速…

day06 51单片机-点阵led

1 点阵LED 1.1 需求描述 本案例介绍如何使用点阵LED显示一排由左上到右下的斜线。 1.2 硬件设计 1.2.1 硬件原理图 点阵内部的原理图: 点阵LED的原理也非常简单,就是LED点灯。例如,我们想要让13列(阳极端)9行(阴极端)的LED点亮,需要13为高电平,9为低电平。注意对于…

苍穹外卖day8(2)用户下单、微信支付

文章目录 前言一、用户下单1. 业务流程2. 接口设计3. 数据库设计3.1 订单表orders3.2 订单明细表 order_detail 4. 代码实现 二、订单支付 前言 用户下单 因为订单信息中包含了其他业务中的数据&#xff0c;在逻辑处理中涉及了多个其他业务&#xff0c;比如要判断地址簿、购物…

基于SSM+Vue的护工预约服务小程序和后台管理系统

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

虚拟化+Docker基本管理

一、虚拟化简介 1、云端 华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、移动云、天翼云、西部数码云等 1.国内云 华为云、阿里云、腾讯云、天翼云(私有云) 2.国外云 谷歌云、亚马逊 2、云计算的服务模式是分层的 IaaS&#xff1a;Infrastructure&#xff08;基础设…

计算机网络【CN】Ch3 数据链路层

目录 数据链路层的功能 【※】VLAN 三种划分VLAN的方法&#xff1a; 【※】MAC帧格式 【※】三种可靠传输机制 ​编辑 【※】介质访问控制 信道划分介质访问控制 随机介质访问控制 CSMA CSMA/CD【有线】 CSMA/CA【无线】 信道利用率技巧 循环冗余校验CRC 以太网[802.3] 以太网…

项目实战 | 责任链模式 (下)

案例二&#xff1a;工作流&#xff0c;费用报销审核流程 同事小贾最近刚出差回来&#xff0c;她迫不及待的就提交了费用报销的流程。根据金额不同&#xff0c;分为以下几种审核流程。报销金额低于1000元&#xff0c;三级部门管理者审批即可&#xff0c;1000到5000元除了三级部…

智己汽车数据驱动中心PMO高级经理张晶女士受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 智己汽车科技有限公司数据驱动中心PMO高级经理张晶女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“规模化敏捷落地实践”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2…

【Java学习笔记】9.5 Java中的Lambda表达式

Lambda表达式是从Java8版本开始增加的语法。Lambda表达式有利于实现函数式编程&#xff0c;简化开发。 9.5.1 Lambda表达式入门 Lambda表达式由三部分组成&#xff1a;参数列表、箭头(->),及一个表达式或语句块。其完整的语法格式如下&#xff1a; (Type 1 param1 , Type…

hcip实验 — 路由策略实验

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置接口及环回ip 2.配置ospf协议及rip协议 3.在R2上进行路由引入 4.在R2上进行路由过滤 5.在R4上进行路由过滤&#xff08;地址前缀列表&#xff09; 6.在R2 RIP进程上配置静默接口使RIP报文无法进入OSPF区域 实验拓扑 …

HCF-Net:用于红外小目标检测的分层上下文融合网络

摘要 红外小目标检测是一项重要的计算机视觉任务&#xff0c;涉及在红外图像中识别和定位微小物体&#xff0c;这些物体通常仅包含几个像素。然而&#xff0c;由于物体尺寸极小以及红外图像中通常复杂的背景&#xff0c;这项任务面临困难。在本文中&#xff0c;我们提出了一种…