【问题标题】:All Common Subsequences in Array of Strings字符串数组中的所有常见子序列
【发布时间】:2011-12-30 05:02:15
【问题描述】:

我试图在 ruby​​ 的字符串数组中找到所有常见的子序列不仅仅是最长的单个子序列

这意味着如果输入是

[“aaaF 你好”,“aaaG 你好”,“aaaH 你好”]

预期的输出是

["aaa", "你好"]

我一直在搞乱最长的单子序列算法,但不知道如何获得适当的输出。大多数方法的问题是它们在最终数组中还有其他元素,例如“a”、“aa”、“h”、“he”、“hel”、“hell”

【问题讨论】:

  • 我不明白为什么“aaa”和“hello”是有效结果,而“aa”例如不是
  • 因为我试图获得最长的子串
  • 不应该是“你好”而不是“你好”吗?

标签: ruby algorithm longest-substring longest-prefix


【解决方案1】:

嗯,像“a”和“aa”这些较小的子序列常见的子序列,所以这不会是不正确的。

如果你真的只想要最长个公共子序列(即那些不包含在任何其他公共子序列中的子序列),你需要做的是检查这些子序列是否是更大公共子序列的一部分,如果是,则丢弃它们。

这可以通过(在伪代码中)完成

finalsubsequences = copy(subsequences);
for(subseq in subsequences) {
   for(subseq2 in subsequences) {
       if(subseq2.indexOf(subseq) != false)
       // subseq contains subseq2, thus discard subseq2
       finalsubsequences.remove(subseq2);
   }
}

祝你好运!

【讨论】:

  • 我已尝试实现此功能,但无法使其正常工作。你有机会写出实际的代码吗?
  • 不幸的是,不是在 Ruby 中,而是在 javascript 或 php 中,当然,如果你喜欢的话。
  • 我已经用 PHP 完成了,我是 ruby​​ 的新手,所以这就是为什么它让我绊倒了,不过谢谢
  • 解决了问题,在遍历数组时,使用 .dup
  • 太好了,你想通了。祝其他剩余工作好运:)
【解决方案2】:
  1. 从数组中选择一个字符串 s。
  2. 迭代所有比 s 短 1 的 s 子串。
  3. 检查每个子字符串是否存在于整个数组中。
  4. 如果是,则将其添加到结果中并继续。如果不是,则转到1,子字符串为s。

这是python/pseudo中的一些代码:

A = String["aaaf hello","aaag hello"]

def find(s):
   res = []
   for sub in [s[1:],s[:-1]]
     if sub in all items in A:
       res.append(sub)
     else:
       res.append(find(sub))
   return res

【讨论】:

  • 嗯,让我在 Ruby 中实现您的建议。
  • 你知道吗,我试过了,但它并不完全正确......我认为威廉的建议更好......对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2022-10-13
  • 2019-07-16
  • 2020-03-20
  • 2020-02-23
  • 1970-01-01
  • 2015-11-29
相关资源
最近更新 更多