给定一个长度为S
m
的字符串和一组长度等于或大于R
的其他字符串 m
。查找集合中以S
作为子序列的字符串。
因此,如果S
为blr
且字符串集为:
bangalore
booleer
bamboo
它应该返回前两个字符串。
我知道我可以找到长度为S
的字符串m
是时间复杂度为O(n)的长度为T
的其他字符串n
的子集+ M)。所以我知道我可以为集合中的每个元素做这个算法,但这将是O(k *(n + m))的时间复杂度,是k
集合的大小(并假设所有字符串长度相同)。这让我想知道是否有某种预处理可以帮助我解决多个字符串的这个问题。
那么,我可以使用任何预处理或结构来解决这个问题吗? 我能达到的最佳时间复杂度是多少? 有没有其他方法可以解决这个问题?
答案 0 :(得分:0)
对于两个字符串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
中的所有字符串答案 1 :(得分:0)
我还没有获得代码实现,但我确实找到了W. J. Hsu和M. W. Du的1984年论文"Computing a longest common subsequence for a set of strings"。
他们的结论是,通过做O(L)预处理时间(其中L是集合中所有字符串的总长度),可以在O(P)中执行每次搜索,其中P是数字针在干草堆中出现的次数。