c++ - 检查字符串是否包含另一个字符串算法?

标签 c++ string algorithm parsing

如果我有字符串 A 和许多其他字符串,我想看看是否有任何其他字符串在 A 中。

什么算法可以在尽可能少的迭代中做到这一点?

例如:

“你好,我叫鲍勃。”

我想看看是否包含“name is b”,它从 [11] 开始。

我不打算使用正则表达式库。

谢谢

最佳答案

最有效的算法是 Aho-Corasick algorithm ,给定一个长度为 n 的字符串和一组总长度为 m 的字符串可以在时间 O(n + m + z) 中找到所有匹配项,其中 z 是报告的匹配项总数。它基于有限自动机,是 KMP string matching algorithm 的推广。 .

此算法的一个很酷的方面是,如果您有一组固定的关键字和一堆要搜索的文本字符串,则可以通过执行 O(m) 预处理来构建匹配器来加快算法速度。然后,您可以在时间 O(n + z) 中找到长度为 n 的字符串中的所有匹配项。

另一方面,如果您有一个固定的字符串,然后想要匹配一组不同的模式字符串,请考虑查看 suffix trees ,它提供相同的运行时保证,但如果文本是固定的,则速度更快。

希望这对您有所帮助!

关于c++ - 检查字符串是否包含另一个字符串算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10892088/

相关文章:

php - JavaScript 和 PHP 中的转义引号

r - 如何根据 R 中定义的列中缺失值的数量返回行值的总和?

c++ - 在 Win7 X64 上使用 Qt Access MS Access 数据库

C++ - 3个类之间的循环依赖

c++ - 三角矩阵转换和自动并行化

C++ - 将字符串的一部分存储在另一个字符串中

c++ - 使用 GL_TRIANGLE_STRIP 或索引 GL_TRIANGLES 绘制动态数量的四边形是否更有效

string - 如何将 &str 转换为 &[u8]

c++ - 如何比较两个 vector 的相等性?

c++ - 查找一定范围内的网格单元