字符串数组中的所有公共子序列

时间:2011-11-16 08:04:08

标签: ruby algorithm longest-substring longest-prefix

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

这意味着如果输入是

  

[“aaaF hello”,“aaaG hello”,“aaaH hello”]

预期输出

  

[“aaa”,“你好”]

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

2 个答案:

答案 0 :(得分: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);
   }
}
祝你好运!

答案 1 :(得分:0)

  1. 从数组中选择一个字符串。
  2. 对s的所有子串进行迭代,然后是s。
  3. 检查每个子字符串是否存在于整个数组中。
  4. 如果是,则将其添加到结果中并继续。如果不是,请将子字符串作为s转到1。
  5. 这是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