String 在多个字符串中查找子序列ocurrence

String 在多个字符串中查找子序列ocurrence,string,algorithm,subsequence,String,Algorithm,Subsequence,给定一个长度为m的字符串,以及一组长度等于或大于m的其他字符串。查找集合中具有S作为子序列的字符串 因此,如果S为blr且字符串集为: bangalore booleer bamboo 它应该返回前两个字符串 我知道我可以找到长度为m的字符串S是否是长度为n的其他字符串T在时间复杂度O(n+m)上的子序列。因此,我知道我可以对集合中的每个元素执行此算法,但时间复杂度为O(k*(n+m)),即k集合的大小(假设所有字符串的长度相同)。这让我想知道是否有某种预处理可以帮助我解决多个字符串的问题 那

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

因此,如果
S
blr
且字符串集为:

bangalore
booleer
bamboo
它应该返回前两个字符串

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

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

对于拖串ch和s如果您想确定ch是否在以s作为子序列的集合中,算法的复杂性为O(n)

public bool函数(字符串ch,字符串s)
{
如果(通道长度

之后,您必须将其应用于R中的所有字符串,用于拖字符串ch和s。如果您想确定ch是否在以s为子序列的集合中,则算法的复杂性为O(n)

public bool函数(字符串ch,字符串s)
{
如果(通道长度

在那之后,你必须将它应用于R中的所有字符串,我没有代码实现,但我确实找到了一篇1984年的论文,作者是许文杰和杜文伟


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

我没有代码实现,但我确实找到了一篇1984年的论文,许文杰、杜文伟著

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

 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;
        }