【问题标题】:Find subsequence ocurrence in multiple strings查找多个字符串中出现的子序列
【发布时间】:2016-06-02 06:03:06
【问题描述】:

给定一个长度为m 的字符串S 和一组其他长度等于或大于m 的字符串R。查找集合中具有S 作为子序列的字符串。

所以,如果 Sblr 并且字符串集是:

bangalore
booleer
bamboo

它应该返回前两个字符串。

我知道我可以找到长度为 m 的字符串 S 是否是其他长度为 n 的字符串 T 的子序列,时间复杂度为 O(n+m)。所以我知道我可以只对集合中的每个元素执行此算法,但这将是 O(k*(n+m)) 的时间复杂度,即 k 集合的大小(并假设所有字符串长度相同)。这让我想知道是否有某种预处理可以帮助我解决多个字符串的问题。

那么,我可以使用任何预处理或结构来解决这个问题吗? 我能达到的最佳时间复杂度是多少? 有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: string algorithm subsequence


    【解决方案1】:

    对于两个字符串 ch 和 s,如果要查找 ch 是否在以 S 作为子序列的集合中,算法的复杂度将是 O(n)

     public  bool function(string ch, string s)
            {
                if (ch.Length < s.Length)
                    return false;
    
                int j = 0;
                for (int i = 0; i < ch.Length; i++)
                {
                    if (ch[i] == s[j])
                    {
                        j++;
                        if (s.Length == j)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }
    

    之后,您必须将它应用于 R 中的所有字符串

    【讨论】:

      【解决方案2】:

      我没有代码实现,但我确实找到了 W. J. Hsu 和 M. W. Du 的 1984 年论文 "Computing a longest common subsequence for a set of strings"

      他们的结论是,通过做 O(L) 的预处理时间(其中 L 是集合中所有字符串的总长度),可以在 O(P) 中执行每个搜索,其中 P 是针出现在大海捞针的次数。

      【讨论】:

        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多