使用Z算法从给定的字符串中删除所有出现的单词

使用z算法从给定的字符串中删除所有出现的单词

本文深入探讨了一个有趣的字符串操作问题:“使用Z算法从给定字符串中删除所有出现的单词”。这个问题是Z算法在模式搜索问题中的一个很好的应用案例,突显了它的有效性。让我们详细探讨一下。

问题陈述

给定一个字符串S和一个单词W,任务是使用Z算法从S中删除所有W的出现。

理解问题

考虑一个字符串 S =“HelloWorldHelloWorld”和一个单词 W =“World”。目标是从 S 中删除所有出现的 W。因此,输出将为“HelloHello”。

Z-算法

Z算法可以在线性时间内找到文本中模式的所有出现。它构建了一个数组(Z数组),其中对于给定的索引i,Z[i]表示从i开始的最长子串的长度,该子串也是字符串的前缀。

算法方法

以下是解决问题的步骤 –

创建一个新的字符串 P = W + ‘$’ + S。

将 Z 算法应用于 P 并构造 Z 数组。

迭代 Z 数组。如果 Z[i] 等于 W 的长度,则意味着 W 存在于该索引处。在该索引处从 S 中删除 W。

Example

的中文翻译为:

示例

这是一个实现上述方法的C++代码:

#includeusing namespace std;vector constructZArray(string str) {   int n = str.length();   vector Z(n, 0);   int L = 0, R = 0;   for (int i = 1; i  R) {         L = R = i;         while (R < n && str[R - L] == str[R])               R++;         Z[i] = R - L;         R--;      } else {         int k = i - L;         if (Z[k] < R - i + 1)               Z[i] = Z[k];         else {               L = i;               while (R < n && str[R - L] == str[R])                  R++;               Z[i] = R - L;               R--;         }      }   }   return Z;}string removeWord(string S, string W) {   string P = W + '$' + S;   int len_W = W.length();   vector Z = constructZArray(P);   vector toRemove(S.size(), false);   for (int i = len_W + 1; i < Z.size(); i++) {      if (Z[i] == len_W)         fill(toRemove.begin() + i - len_W - 1, toRemove.begin() + i - 1, true);   }      string result = "";   for (int i = 0; i < S.size(); i++) {      if (!toRemove[i])         result += S[i];   }   return result;}int main() {   string S, W;   S="Iamwritingwriting";   W = "writing";   cout << "String after removal: " << removeWord(S, W);   return 0;}

输出

String after removal: Iam

测试用例示例

让我们考虑一个例子 –

假设 S = “Iamwritingwriting”,W = “writing”。程序将输出 “Iam”。原因如下 −

新的字符串P变为”writing$Iamwritingwriting”。

应用Z算法后,我们发现Z[8]和Z[15]等于W的长度,这意味着W存在于S中的这些索引处。

李>

然后我们从S中移除这些索引中的W,得到字符串”Iam”。

结论

Z 算法是解决模式搜索问题的强大工具。在本文中,我们看到了它在从字符串中删除所有出现的单词方面的应用。这个问题是一个很好的例子,展示了理解和应用字符串匹配算法的好处。永远记住,理解和学习算法开辟了解决复杂问题的方法。

以上就是使用Z算法从给定的字符串中删除所有出现的单词的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:24:20
下一篇 2025年12月17日 21:24:47

相关推荐

  • css中设置英文单词之间间距的属性是什么

    css中设置英文单词之间间距的属性是word-spacing。word-spacing属性可以增加或减少字与字之间的空白,如【p{word-spacing:30px;}】。 本文操作环境:windows10系统、css 3、thinkpad t480电脑。 css中有一个word-spacing属性…

    2025年12月24日
    000
  • 什么时候可以确认SessionStorage已被删除?

    如何确定 SessionStorage 何时被删除? 简介:SessionStorage 是 HTML5 中提供的一种客户端存储方式,用于在浏览器会话期间保存数据。与 Cookie 相比,SessionStorage 存储的数据不会被发送到服务器端,也不会随着页面刷新而丢失。然而,有时我们需要清除 …

    2025年12月21日
    000
  • 什么情况下会导致SessionStorage被清除?

    SessionStorage是HTML5提供的一种用于在浏览器中存储数据的技术。它与LocalStorage相似,但有一些特定的使用场景和限制。本文将介绍SessionStorage在什么情况下会被删除,并提供具体的代码示例。 SessionStorage是一种会话级别的存储机制,它的数据只在当前会…

    2025年12月21日
    000
  • 恢复被删除的Localstorage数据的方法有哪些?

    如何恢复被删除的Localstorage数据? Localstorage是一种用于在网页中存储数据的技术。它被广泛应用于各种网页应用程序中,以便在多个页面之间共享数据。然而,有时候我们可能会意外地删除了Localstorage中的数据,这给我们带来了困扰。那么,如何恢复被删除的Localstorag…

    2025年12月21日
    000
  • 添加或删除 HTML dom元素

    文档对象模型(document object model,简称dom),是w3c组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为dom,本章内容我们就分享给大家关于添加或删除 html dom元素的教程,赶紧来学…

    好文分享 2025年12月21日
    000
  • 使用C++删除链表的第一个节点

    给定一个链表,我们需要删除它的第一个元素并将指针返回到新链表的头部。 Input : 1 -> 2 -> 3 -> 4 -> 5 -> NULLOutput : 2 -> 3 -> 4 -> 5 -> NULLInput : 2 -> 4 …

    2025年12月17日
    000
  • 使一个字符串等于另一个字符串所需删除的最长子字符串的长度

    在本文中,我们将讨论找到需要删除的最长子字符串的长度以使一个字符串等于另一个字符串的问题。我们将首先理解问题陈述,然后探索解决该问题的简单和有效的方法,以及它们各自的算法和时间复杂度。最后,我们将用 C++ 实现该解决方案。 问题陈述 给定两个字符串 A 和 B,确定需要从字符串 A 中删除的最长子…

    2025年12月17日
    000
  • 使用O(1)额外空间反转单词

    一个字符串可能由多个%ignore_a_1%组成。C++字符串中的每个单词可以包含字母、数字或特殊符号。字符串被认为是这些字符的存储元素。每个单词由一个空格字符分隔。每个单词也形成一个字符的字符串。在C++中,任何字符串的反向是遵循以下几点的字符串− 它是通过从末尾向开头取字符形成的。 原始字符串的…

    2025年12月17日
    000
  • 使一个数能被4整除,最少需要删除的数字个数

    在本文中,我们将探讨一个有趣的计算问题 – “使一个数字能被 4 整除所需删除的最少位数”。这个问题是编码竞赛和基于算法的面试中的常见问题,为提高您的问题解决能力提供了极好的练习。 首先,让我们理解问题陈述:我们有一个数字,我们的任务是删除最少数量的数字,使得剩余的数字能被 4 整除。 …

    2025年12月17日
    000
  • 检查一个二进制字符串是否可以通过删除非相邻字符来按降序排序

    在这个问题中,我们需要通过仅删除不相邻的元素来按降序对给定的二进制字符串进行排序。 为了解决这个问题,我们需要删除二进制字符串中所有位于 1 之前的 0。如果我们在字符串中的任何位置发现两个连续的零后面有两个连续的1,则意味着我们无法对字符串进行降序排序。否则,我们可以针对每种情况进行分类。 问题陈…

    2025年12月17日
    000
  • 排序二进制字符串所需删除的最小字符数,以使其按升序排列

    在计算机科学中,字符串操作是一个重要的主题,涉及到拼接、子串、反转等操作。与字符串操作相关的一个常见问题是从二进制字符串中移除所有的0。在本文中,我们将讨论一种使用最少数量的非相邻对翻转来解决这个问题的算法。 问题陈述 给定一个二进制字符串,我们必须使用最少次数的非相邻对翻转来删除字符串中的所有 0…

    2025年12月17日
    000
  • 在C程序中,将句子中最长的回文单词打印出来

    给定一个句子,挑战是从给定的句子中找到最长的回文 什么是回文? 回文是一个单词或序列,即使在之后其含义仍然保持不变反转字符串 示例 – Nitin,反转字符串后其含义保持不变。 挑战是从给定的句子中找到最长的回文。 喜欢的句子是:malayalam liemadameil iji 它包含…

    2025年12月17日
    000
  • 使用递归从已排序的链表中删除重复项

    链表是连接在一起的元素序列。每个列表都有一个头和一系列节点,每个节点都有当前节点的数据并链接到下一个节点。链表的基本操作是插入、删除、查找和删除。 从排序链表中删除重复项 删除节点的一​​种方法是使用递归。其思想是将每个节点与其相邻节点进行比较,并删除它们相等的重复节点。 我们的递归调用将返回到下一…

    2025年12月17日
    000
  • python中如何删除dict元素?

    del 删除指定键,键不存在时抛出 KeyError;2. pop() 删除键并返回值,可设默认值避免错误;3. popitem() 删除并返回最后一个键值对;4. clear() 清空所有元素。 在 Python 中删除字典(dict)元素有几种常用方法,根据不同的使用场景可以选择合适的方式。 使…

    2025年12月15日
    100
  • python中怎么删除字典中的键值对_Python删除字典元素的方法

    删除字典键值对有四种方法:del语句删除指定键,pop()删除键并返回值,popitem()随机删除键值对,clear()清空字典。 在 Python 中,删除字典中的键值对主要有几种方式:使用 del 语句直接删除指定键,利用 pop() 方法删除指定键并获取其对应的值,或者通过 popitem(…

    2025年12月14日
    000
  • 简便删除Conda环境:高效清理无用环境的技巧

    一键删除Conda环境:快速清理无用环境的技巧 随着数据科学和机器学习的快速发展,使用Python进行开发和分析的需求也越来越强烈。Conda作为一种流行的Python包管理器和环境管理工具,被广泛应用于项目开发和环境配置中。然而,随着时间的推移,我们常常会在计算机上留下许多无用的Conda环境,这…

    2025年12月13日
    000
  • Python程序用于从数组中删除给定数量的第一个项目

    数组是一种数据结构,用于存储一组相同数据类型的元素。数组中的每个元素都由索引值或键来标识。 Python 中的数组 Python 没有原生的数组数据结构。相反,我们可以使用List数据结构来表示数组。 [1, 2, 3, 4, 5] 我们还可以使用数组或 NumPy 模块来处理 Python 中的数…

    2025年12月13日
    100
  • 使用Python计算字符串中单词的长度

    使用 Python 查找给定输入字符串中各个单词的长度是必须解决的问题。我们想要计算文本输入中每个单词的字符数,并以结构化样式(如列表)显示结果。该任务需要分解输入字符串并分隔每个单词。然后根据其中的字符数计算每个单词的长度。基本目标是创建一个可以有效接收输入、确定字长并及时输出结果的函数或过程。在…

    2025年12月13日
    000
  • 系统盘的Windows.old文件夹可以删除吗

    出现Windows.old是在升级或重装系统时,如Win10升Win11、保留个人文件重装等情况下,系统为保留旧文件而创建的备份文件夹,内含原系统文件、程序数据和个人资料,占用数GB至十几GB空间;可在确认新系统运行正常且已迁移所需文件后删除,建议升级10天后操作,因系统默认保留10天用于回滚;应通…

    2025年12月6日 电脑教程
    000
  • MySQL学习笔记之创建、删除、修改表的方法_MySQL

    本文实例讲述了mysql学习笔记之创建、删除、修改表的方法。分享给大家供大家参考,具体如下: 创建表: create table users( id int, name varchar(64), sex bit(1), birthday date, Entry_date date, job varc…

    2025年12月2日
    000

发表回复

登录后才能评论
关注微信