当前位置: 首页 > news >正文

LeetCode 3302.字典序最小的合法序列

给你两个字符串 word1 和 word2 。

如果一个字符串 x 修改 至多 一个字符会变成 y ,那么我们称它与 y 几乎相等 。

如果一个下标序列 seq 满足以下条件,我们称它是 合法的 :

下标序列是 升序 的。
将 word1 中这些下标对应的字符 按顺序 连接,得到一个与 word2 几乎相等 的字符串。

请你返回一个长度为 word2.length 的数组,表示一个 字典序最小 的 合法 下标序列。如果不存在这样的序列,请你返回一个 空 数组。

注意 ,答案数组必须是字典序最小的下标数组,而 不是 由这些下标连接形成的字符串。

示例 1:

输入:word1 = “vbcca”, word2 = “abc”

输出:[0,1,2]

解释:

字典序最小的合法下标序列为 [0, 1, 2] :

将 word1[0] 变为 ‘a’ 。
word1[1] 已经是 ‘b’ 。
word1[2] 已经是 ‘c’ 。
示例 2:

输入:word1 = “bacdc”, word2 = “abc”

输出:[1,2,4]

解释:

字典序最小的合法下标序列为 [1, 2, 4] :

word1[1] 已经是 ‘a’ 。
将 word1[2] 变为 ‘b’ 。
word1[4] 已经是 ‘c’ 。
示例 3:

输入:word1 = “aaaaaa”, word2 = “aaabc”

输出:[]

解释:

没有合法的下标序列。

示例 4:

输入:word1 = “abc”, word2 = “ab”

输出:[0,1]

提示:

1 <= word2.length < word1.length <= 3 * 105^55
word1 和 word2 只包含小写英文字母。

我们需要找到下标的字典序最小的合法序列,因此在对word1和word2进行匹配时,如果两个字符相等,那么一定要匹配上,这样才能保证下标的字典序最小;否则两个字符不等时,如果把当前word1中的字符修改为word2中的字符后,后面如果两个字符串还能匹配上,则需要把当前字符加入答案数组,如何知道后面两个字符串是否还能匹配上,可以使用后缀数组,我们先反向遍历word1和word2,找出word1的后缀能匹配到的最长word2后缀,然后用数组把每个word1下标对应的能匹配到的最长word2后缀的开始位置记录下来:

class Solution {
public:vector<int> validSequence(string word1, string word2) {int size1 = word1.size();int size2 = word2.size();vector<int> suf(size1 + 1);suf[size1] = size2;int idx1 = size1 - 1;int idx2 = size2 - 1;while (idx1 >= 0 && idx2 >= 0) {if (word1[idx1] == word2[idx2]) {--idx2;}// word1的idx1下标最多能匹配到word2[idx2 + 1, word2.size()]suf[idx1] = idx2 + 1;--idx1;}while (idx1 >= 0) {suf[idx1] = idx2 + 1;--idx1;}vector<int> ans(size2);idx1 = 0;idx2 = 0;bool hasChanged = false;while (idx1 < size1 && idx2 < size2) {// 如果能匹配到// 或没有改变过,且改变后可以匹配成功// 则将idx1加入结果数组if (word1[idx1] == word2[idx2] || !hasChanged && suf[idx1 + 1] <= idx2 + 1) {if (word1[idx1] != word2[idx2]) {hasChanged = true;}ans[idx2] = idx1;++idx1;++idx2;} else {++idx1;}// 找到目标长度的答案if (idx2 == size2) {return ans;}}return {};}
};

如果word1的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(n)。


文章转载自:

http://YJOL9jyT.LrpLh.cn
http://ZBlMNO7o.LrpLh.cn
http://TKaxYPZu.LrpLh.cn
http://VjN075ct.LrpLh.cn
http://fsgdlGu2.LrpLh.cn
http://9USS8yHc.LrpLh.cn
http://GVog9bgW.LrpLh.cn
http://DO3I4bNR.LrpLh.cn
http://68cfrWj1.LrpLh.cn
http://sXWrnhOZ.LrpLh.cn
http://5tslqhDz.LrpLh.cn
http://yC4Di7dV.LrpLh.cn
http://RBy1eSDG.LrpLh.cn
http://R1atvICn.LrpLh.cn
http://5MvgJl0i.LrpLh.cn
http://PRoTMX6I.LrpLh.cn
http://vg8E61dq.LrpLh.cn
http://mq0DVE8h.LrpLh.cn
http://VUAZMd7X.LrpLh.cn
http://eOrCHsGr.LrpLh.cn
http://CGTBPQAJ.LrpLh.cn
http://0zd3zxrm.LrpLh.cn
http://ZxSW8udO.LrpLh.cn
http://VycfCooO.LrpLh.cn
http://a579VtAF.LrpLh.cn
http://Y6a0MhRv.LrpLh.cn
http://DOOjv5jl.LrpLh.cn
http://hSgdxn22.LrpLh.cn
http://aqNPyjtd.LrpLh.cn
http://TmtoBVLa.LrpLh.cn
http://www.dtcms.com/a/383110.html

相关文章:

  • 深入解析3x3矩阵:列优先与行优先约定的全面指南
  • Codeforces 1049 Div2(ABCD)
  • 【开题答辩全过程】以 “居逸”民宿预订微信小程序为例,包含答辩的问题和答案
  • AWS IAM 模块全面优化:实现完整生命周期管理与性能提升
  • RK3568 PWM驱动基础知识
  • 贪心算法应用:钢铁连铸优化问题详解
  • 9. LangChain4j + 整合 Spring Boot
  • 返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
  • React Native架构革命:从Bridge到JSI性能飞跃
  • Qt---描述网络请求QNetworkRequest
  • XLua教程之Lua调用C#
  • 第七章:AI进阶之------条件语句(if-elif-else)(一)
  • 从希格斯玻色子到QPU:C++在高能物理与量子计算领域的跨界征程与深度融合
  • 二、vue3后台项目系列——安装相关依赖、项目常用辅助开发工具
  • Knockout.js 备忘录模块详解
  • VS2022下载+海康SDK环境配置实现实时预览
  • 前端基础 —— C / JavaScript基础语法
  • 手搓一个 DELL EMC Unity存储系统健康检查清单
  • 字节M3-Agent:如何实现一个支持多模态长期记忆与推理的Agent
  • TCL华星计划投建第8.6代印刷OLED产线
  • Qt学习:moc生成的元对象信息
  • Java—JDBC 和数据库连接池
  • 软件工程实践四:MyBatis-Plus 教程(连接、分页、查询)
  • 用 Go 快速上手 Protocol Buffers
  • Java Stream 流学习笔记
  • Linux线程id与简易封装线程实现
  • 公链分析报告 - Secret Network
  • JavaScript 简单链表题目试析
  • 【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
  • 电商AI导购系统的模型部署架构:TensorFlow Serving在实时推荐中的实践