如何找到字符串中子字符串的所有位置?
我想在一个大字符串中搜索字符串的所有位置。
I want to search a large string for all the locations of a string.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我想在一个大字符串中搜索字符串的所有位置。
I want to search a large string for all the locations of a string.
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
其他两个答案是正确的,但它们非常慢并且具有 O(N^2) 复杂度。但是有 Knuth-Morris-Pratt 算法,以 O(N) 复杂度查找所有子串。
编辑:
另外,还有另一种算法:所谓的“Z函数”,复杂度为O(N),但我找不到该算法的英文源(也许是因为也有另一个更著名的同名函数 - Rieman 的 Z 函数),所以我将把它的代码放在这里并解释它的作用。
The two other answers are correct but they are very slow and have O(N^2) complexity. But there is the Knuth-Morris-Pratt algorithm, which finds all substrings in O(N) complexity.
Edit:
Also, there is another algorithm: the so-called "Z-function" with O(N) complexity, but I couldn't find an English source for this algorithm (maybe because there is also another more famous one with same name - the Z-function of Rieman), so I will just put its code here and explain what it does.
使用
std::string::find
。您可以执行以下操作:编辑:哦!感谢您的评论,纳瓦兹!更好的?
Using
std::string::find
. You can do something like:EDIT: Doh! Thanks for the remark, Nawaz! Better?
为了完整起见,我将添加另一种方法,可以使用
std::search
,其工作方式类似于std::string::find
,不同之处在于您使用迭代器,例如:我发现这有时优于
std::string::find
,特别是。如果您将字符串表示为vector
。I'll add for completeness, there is another approach that is possible with
std::search
, works likestd::string::find
, difference is that you work with iterators, something like:I find that this sometimes outperforms
std::string::find
, esp. if you represent your string as avector<char>
.只需
使用 std::string::find()
返回找到子字符串的位置,或者使用std::string::npos
如果没有找到。这里是文档。
这是取自本文档的示例:
Simply
use std::string::find()
which returns the position at which the substring was found, orstd::string::npos
if none was found.Here is the documentation.
An here is the example taken from this documentation:
当与字符串一起使用时,Mihran Hovsepyan 解决方案比 std::string::find() 快得多,但在 2011 年,还没有 std::string_view。将 std::string::find() 与 std::string_view 一起使用要快得多,几乎与 strstr 一样快。
这是一个基准:
代码:
Mihran Hovsepyan solution is much faster than std::string::find() when used with strings, but in 2011, there was no std::string_view. Using std::string::find() with std::string_view is muuuch faster, almost as fast as strstr.
Here is a benchmark:
Code: