Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 高效地查找字符串中的任何子字符串集_String_Algorithm_Substring - Fatal编程技术网

String 高效地查找字符串中的任何子字符串集

String 高效地查找字符串中的任何子字符串集,string,algorithm,substring,String,Algorithm,Substring,假设我们有3个字符串:“ab”、“cd”和“ef” 让我们假设要搜索的子字符串是上述字符串的排列,即{“abcdef”、“abefcd”、“efabcd”、“efcdab”、“cdefab”、“cdabcf”中的任何一个 现在让我们假设我们有一个长字符串,并且我们希望在其中找到上述集合中的任何子字符串(稍微简化一下情况,并假设主字符串中只有一个子字符串出现一次)。 例如 Main string: abcdghefcdabgh Substring: efcdab 在这种情况下,最

假设我们有3个字符串:
“ab”、“cd”和“ef”

让我们假设要搜索的子字符串是上述字符串的排列,
即{“abcdef”、“abefcd”、“efabcd”、“efcdab”、“cdefab”、“cdabcf”中的任何一个
现在让我们假设我们有一个长字符串,并且我们希望在其中找到上述集合中的任何子字符串(稍微简化一下情况,并假设主字符串中只有一个子字符串出现一次)。
例如

Main string: abcdghefcdabgh
Substring:         efcdab
在这种情况下,最有效的搜索方式是什么?使用蛮力搜索每个可能的子字符串效率很低
Rabin Karp多模式搜索是我想到的一种方法。但是,我不确定在这种情况下,高效的哈希函数是什么。

搜索任何“ab”,在+1或-1处找到“cd”或“ef”,继续,直到找到整个排列

例如:

使用
“ab”、“cd”、“ef”

在“asjkdnjdnaboidnabefcdasdnmk”中

“ab”
的第一个实例位于
9
,因此:

lowerFound = 9
upperfound = 11 \\ found index + length of found string
从这里您知道排列中的任何其他匹配必须在
下方格
之前或
上方格
之上,因此请查看两侧,例如:
dn ab oi
不包含任何匹配项,因此放弃并在
15

lowerFound = 15
upperfound = 17
search for "cd" or "ef" at 15-length or 17
found "ab"+"ef"

lowerFound = 15
upperfound = 19
search for "cd" at 15-length or 19
found "abef"+"cd"

return
我已经制定了一个程序来实现这一点,但它相当大,而且是行式的,所以我把它放在这里,请随意批评这种方法。

为了减少最坏情况
“abababcdef”
您可能希望保留已在内存中搜索的索引。

我不确定是否可以选择查找模式字符串的所有排列,但如果可以在合理的时间内找到这些排列,则可以使用此算法,同时检查所有图案

另一种需要额外空间的快速方法是在文本上构建后缀树。然后匹配每个模式。 生成树是O(n),其中n是文本大小。 匹配每个图案的是O(p),其中p是每个图案的长度


Total time=O(p1+p2+p3…+n)

所描述的Rabin-Karp滚动散列有什么问题?对于您描述的特定情况,检查所需长度的搜索字符串的每个子字符串(其中有O(n)个用于搜索字符串长度n)并查看这是否是目标字符串似乎并不那么低效。如果目标字符串集很小,您可以在O(m)中构建一个哈希表(其中m是目标字符串的数量)。。。否则,您可以构建某种搜索树之类的东西。我不知道你怎么认为你能比O(n+m)做得更好。。。抱歉,如果这遗漏了一些明显的东西,那就太过密集了。@robmayoff嗯,这没什么问题。我只是想知道有没有一个更好的方法我没有:)@Patrick87这是一个关于interviewstreet的facebook挑战的问题。我所描述的案例非常小。问题说要搜索的字符串可能有一百万个字符长,并且可以从中选择的子字符串的数量是100!(这里是3!)