对于固定子串搜索,有两种已知的算法具有O(n)运行时和O(1)工作空间:SMOA和双向(参见http://www-igm.univ-mlv.fr/~lecroq/string/)。它们都取决于在字母表上加上或强制订购。
假设不是搜索固定的子串,而是希望能够搜索用括号表达式表示的一组子串中的任何一个,例如。
[abc]d
将匹配“ad”,“bd”或“cd”。假设字母表是有限的,任何括号的长度都是有界的,因此在时间或空间要求中形式为“括号长度”的任何术语都是O(1)。
有没有办法在O(n)时间内执行搜索(其中n
是要搜索的字符串的长度,即“haystack”)和O(1)工作空间?
除非解决方案涉及以字母顺序排序括号集,否则该问题的任何解决方案将为O(n)/ O(1)中的固定子串搜索问题提供新的解决方案,而无需排序要求,因此似乎不太可能存在。
答案 0 :(得分:0)
我一定错过了什么。从您的链接页面,强力方法是O(n)。看起来你可以轻松地写出你想要的东西:
1. Pattern is P with index p indicating which element of the pattern we are on.
2. String is S with index s indicating which element of the string we are on.
3. if S[s] matches P[p], increment both indicies and repeat until you complete the Pattern.
4. If S[s] doesn't match P[p], set p=0 and increment p.
那将是O(n)并满足您的要求。