【问题标题】:How to find all common longest substrings of a list of strings如何查找字符串列表的所有常见最长子字符串
【发布时间】:2015-11-06 16:34:55
【问题描述】:

我有一个字符串列表,我需要在其中找到所有常见的唯一子字符串(实际上是路径),其中的长度最短。示例:

/a/b/c

/a/b

/a

/d/e/f

/d/e

/g/h

对于这个输入,我需要以下结果:

/a

/d/e

/g/h

如您所见,我需要具有唯一前缀的最小长度的路径(或子字符串)。 /a 是所有以 /a 开头的路径的最小子字符串。 /d/e 是所有以 /d/e 开头的路径的最小子字符串。 /g/h 也是如此。

此方法的一个实际应用是找到其中包含某个文件的路径树的所有根,以进一步分析它们。考虑这个例子:

/a/b/c/index.html

/a/b/index.html

/a/index.html

/d/e/f/index.html

/d/e/index.html

/g/h/index.html

假设我想要包含 index.html 文件的最顶层(就根而言)路径。结果,我想要“/a/index.html”、“/d/e/index.html”和“/g/h/index.html”。

有什么想法吗? “简单”最长公共子串问题有很多理论和例子,但我还没有找到有效找到所有公共最长子串的解决方案。

非常感谢使用伪代码的解决方案。

【问题讨论】:

  • 最长的子串是否总是该组的成员?而且,您使用的是什么语言? (您可以为此添加标签。)而且,我不明白为什么 /g/h 会成为输出的一部分。
  • 从您的示例中,我假设您需要覆盖整个列表的最小子字符串集。这是正确的吗?
  • 如果您考虑输入的所有项目,则没有公共子字符串,您是在谈论 3 个不同的输入及其对应的输出吗?
  • 亲爱的投票者,请告诉我们,任务是什么......
  • @KarolyHorvath 不,我的意思是 a 涵盖了前三个条目(abcaba),de 涵盖了 dedef 和 @ 987654331@ 覆盖gh。因此,源集中没有元素在结果集中没有子字符串。这是我的猜测:)

标签: string algorithm substring longest-substring


【解决方案1】:

现在有了改进的描述,我认为以下算法可以:

  1. 将字符串列表拆分为段列表(字符串数组列表)
  2. 从 i = 1 开始,并在每次迭代中增加它,执行以下操作(第 3 步和第 4 步),直到段列表中没有更多项目:
  3. 将所有长度为 i 的段数组添加到当前解决方案的列表(如果还没有的话)以及最终解决方案的相应路径。
  4. 从段列表中删除前 i 个项目与当前解决方案中的一个项目相同的所有项目(然后重置当前解决方案)。

【讨论】:

  • 工作就像一个魅力。谢谢!
猜你喜欢
  • 2020-02-23
  • 2020-03-20
  • 2011-10-02
  • 2021-12-28
  • 2019-07-16
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多