回答
运行时间和内存的复杂性是差不多的。您可以在O(N)中准备模式,并且可以在O(M)(您的字符串的长度)中进行搜索。
后缀树可以执行一些可能对您的应用程序不必要的操作。
在KMP中,您准备了一种搜索模式,然后您可以轻松地以may字符串查找它。
在后缀树中,您准备要搜索的文本,然后您可以轻松地在其中查找很多模式。尽管内存使用量是线性的,但常量很大,因此需要更多的内存。
KMP通常比后缀树更容易编码。
感谢Sorin,很好的回答,你能否再提一点建议你是什么意思“后缀树可以做更多的操作,而这些操作对你的应用来说可能不是必需的”?谢谢。 –
另一个快速的问题,你的意见,“你在O(N)准备模式,你可以搜索O(M)(你的字符串的长度)”,N是模式的长度,M是长度源字符串的?谢谢。 –
通过后缀树,您可以找到子串重复(xabcyzabcq - > abc * 2)或回文序列(xyzabcdcbaxyz - > abcdcba)。维基百科有一个很好的总结。 – Sorin
- 1. 字符串匹配:使用kmp算法计算最长的前缀后缀数组
- 2. 字符串匹配中的前缀与后缀Trie
- 3. 匹配字符串的所有前缀
- 4. 后缀树(二进制字符串):查找最长的子字符串
- 5. 在PHP中匹配字符串前缀
- 6. 匹配字符串与前缀
- 7. 后缀树:最长的重复子字符串实现
- 8. 最长的重复子字符串后缀树dfs
- 9. 后缀树和最长的重复子字符串问题
- 10. 用字符串匹配子字符串
- 11. KMP字符串匹配算法:辅助阵列输出
- 12. 使用KMP-Algorithm在字符串匹配中处理通配符'*'运算符?
- 13. 匹配后缀为case case语句的字符串
- 14. 如何从后缀树中删除子字符串?
- 15. 带有前缀和后缀的匹配字符串使用Logstash grok pattern
- 16. Java搜索字符串(kmp)
- 17. 特定字符后字符串匹配
- 18. 在匹配子串后替换字符串的所有后续字符
- 19. 后缀数组并搜索字符串中的子字符串
- 20. 正则表达式匹配整个字符串只有当它缺少给定的子字符串/后缀
- 21. 匹配匹配字符串的正则表达式的子串
- 22. 是-K-子串与后缀树
- 23. 字符串的后缀
- 24. PHP如何找到字符串后匹配/通配符/匹配
- 25. 字符串后匹配数字
- 26. 匹配字符串中的一个子
- 27. API对于KMP或Boyer-Moore字符串模式匹配的C++/STL?
- 28. 如何匹配字符串末尾的子字符串,然后只删除该子字符串?
- 29. emacs lisp中的字符串匹配匹配任意字符串
- 30. 提取部分匹配两个子字符串的字符串
你能清楚地描述你的问题吗?什么是数据范围?什么样的查询? – throwit
@ F.Ju,我需要找到一个字符串是否是另一个字符串的子字符串。例如,“ello”是“hello”的子字符串。期待您的建议。 :) –
如果你只有两个字符串我觉得KMP足够了 – throwit