两个字符串序列中的最长公共子串

2024-03-12

刚刚学习了最长公共子串算法,我对这个问题的一个特定变体感到好奇。其描述如下——

给定两个非空字符串序列,X = (x1, x2, x3,....,x(n)) 和 Y = (y1, y2, y3,..., y(m)),其中 x (i) 和 y(i) 是字符串,求longestX 中的字符串,它是allY 的字符串。

我有一个函数substring(x, y)它返回描述 x 是否是 y 中的子字符串的布尔值。显然,我必须将 Y 中的所有字符串连接起来形成一个大字符串,例如用 B 表示。我想到了以下方法 -:

  • Naive:首先连接 X 中的所有字符串形成字符串 A(n)。应用 substring(A(n), B) - 这包括在字符串 A(n) 中向后迭代。如果为 true,则算法在此结束并返回 A(n) - 或所述子字符串中包含的任何部分。如果不是,则继续应用 (A(n - 1), B),依此类推。如果 X 中不存在这样的字符串,则返回空字符串。

显然,根据实现情况,这种方法会占用相当多的运行时间。假设我使用迭代方法,在每次迭代中我都必须向后迭代该级别/索引的字符串,然后应用 substring()。至少需要两个循环,并且O(size(B) * maxlength(x1, x2,...))最坏情况时间,或者更多取决于 substring() (如果错误请纠正我)。

我想到了第二种基于后缀树/数组的方法。

  • 广义后缀树:我使用 Ukkonen 的算法构建了序列 Y 的 GSTO(maxlength(y1, y2,...)(?)。我对后缀树缺乏了解。我相信后缀树方法将大大减少查找子字符串的运行时间(以空间为代价),但我不知道如何实现该操作。

如果有更好的方法,我很想知道。

编辑:如果我似乎放弃了这个话题,我深表歉意。

如果我不使用 GST,而是使用一些标准数据结构(例如堆栈、队列、集合、堆、优先级队列等)怎么办?序列 X 必须进行排序,自然是最大的字符串在前。如果我将它存储在字符串数组中,我将不得不使用排序算法,例如归并排序/快速排序。目标是获得尽可能最有效的运行时间。

我是否可以将 X 存储在一个在构建自身时自动对其元素进行排序的结构中?最大堆怎么样?

后缀树似乎是以这种方式查找子字符串的最佳方法。还有其他我可以使用的数据结构吗?


首先,将最长字符串的数组 X 排序得更短。这样,X 中作为所有 Y 字符串的子字符串的第一个字符串就是解。

多处理器算法将是解决快速测试每个 X 字符串与所有 Y 字符串问题的最佳方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个字符串序列中的最长公共子串 的相关文章

  • 使用 O(1) 辅助空间迭代二叉树

    是否可以在 O 1 辅助空间中迭代二叉树 不使用堆栈 队列等 或者这已被证明是不可能的 如果可以的话 怎样才能做到呢 编辑 我得到的关于如果有指向父节点的指针就可能实现这一点的响应很有趣 我不知道可以做到这一点 但取决于您如何看待它 这可以
  • Python 中的列表是否有等效的 str.split ?

    如果我有一个字符串 我可以用空格将其分割str split method hello world split returns hello world 如果我有一个像这样的列表 hey 1 None 2 0 string another st
  • python 中字符串到 OrderedDict 的转换

    我通过导入集合创建了一个 python 有序字典并将其存储在名为 filename txt 的文件中 文件内容看起来像 OrderedDict 7 0 6 1 5 2 4 3 我需要从另一个程序使用这个 OrderedDict 我这样做 m
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • sprintf 与 String.Format 的性能[重复]

    这个问题在这里已经有答案了 我正在比较 sprintf 用法的性能 并对我所看到的感到有点困扰 我测试了以下 4 个方法 将 ClassWithToString 的实例传递给每个方法 PrintInt 除外 它接收实际的整数值 type C
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • C++字符串解析思路

    我有另一个程序的输出 它更适合人类可读而不是机器可读 但无论如何我都会解析它 没什么太复杂的 然而 我想知道在 C 中执行此操作的最佳方法是什么 这更像是一个 一般实践 类型的问题 我研究了 Boost Spirit 甚至让它发挥了一些作用
  • 快速计算幂(例如 2^11)[重复]

    这个问题在这里已经有答案了 可能的重复 实现基于整数的幂函数 pow int int 的最有效方法 https stackoverflow com questions 101439 the most efficient way to imp
  • JavaScript 中多个数组的笛卡尔积

    如何在 JavaScript 中实现多个数组的笛卡尔积 举个例子 cartesian 1 2 10 20 100 200 300 应该返回 1 10 100 1 10 200 1 10 300 2 10 100 2 10 200 2020
  • 评估 R 中字符串指向的函数

    假设我有以下内容 x lt 1 10 squared lt function x x 2 y lt squared 我希望能够使用 y 定义的字符串来评估该函数 像 eval y 这样的东西 我知道这是错误的 但会返回 1 1 4 9 16
  • 如何规划庭院灯最有效的路线

    我正在尝试挂一些庭院灯 基于另一个问题 https cs stackexchange com questions 80134 christmas light route efficiency我问 我意识到我需要一种算法来解决路由检查问题 h
  • 如何找到权重为 1、0、-1 且成本精确为 0 的多维路径

    我得到了一个有向图 其中有 n 个节点和边 向量的权重 每个向量的长度为 m 为数字 1 0 1 我想找到从一个节点到另一个节点 我们可以多次访问节点 的任何路径 或者说这样的路径不存在 使其权重之和等于仅由零组成的向量 我正在考虑暴力回溯
  • 查找预排序数组中给定值的最低索引

    嘿 我在采访中遇到了这个问题 想知道解决它的最佳方法是什么 假设给定一个已经排序的数组 并且您想要找到某个值 x 的最低索引 这是我想出的 python 伪代码 我只是想知道是否有更好的方法来实现它 def findLowestIndex
  • VB6中如何将十六进制字符串转换为字节数组

    我有以下字节数组 Dim Template 1023 As Byte 然后我调用指纹扫描仪设备函数并返回以下内容 Template 0 70 Template 1 77 Template 2 82 Template 1023 0 然后我将字
  • 在C#中使用字符串调用变量

    我试图使用循环来编辑多个文本框的数据 但我无法弄清楚如何转换内容是我的框名称的字符串来访问每个框的文本元素 private void reset Click object sender EventArgs e string cell for
  • 将子字符串从 char* 复制到 std::string 的优雅方法

    我有这个char char line This is a great day string subLine 我要那个subLine会包括 is a great 从第 5 处复制 接下来的 10 个字符 有没有办法做到这一点而不是转换char
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li
  • 拉伸数组

    我有一个形成曲线的样本向量 假设其中有 1000 个点 如果我想将其拉伸到填充 1500 个点 给出不错结果的最简单算法是什么 我正在寻找一些只有几行 C C 的东西 我总是想增加向量的大小 并且新向量可以是当前向量大小的 1 1 倍到 5
  • Matlab中反转一位逻辑位

    是否存在更好的方法来反转 X 的元素 gt gt X dec2bin 10 X 1010 我这样做了 x i num2str 1 str2num x i 如果我理解正确的话 你想将一位设置为 1 使用bitset bitset x bitN
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程

随机推荐