KMP算法

简介: KMP算法


KMP算法

题目描述

判断一个字符串是不是另一个字符串的子字符串,并返回其位置。

输入输出样例

输入一个母字符串和一个子字符串,输出一个整数,表示子字符串在母字符串的位置,若不存在则返回-1。

Input: haystack = "hello", needle = "ll"
Output: 2

题解

使用著名的Knuth-Morris-Pratt(KMP)算法,可以在 O(m + n) 时间利用动态规划完成匹配。

// 主函数
int strStr(string haystack, string needle)
{
    int k = -1, n = haystack.length(), p = needle.length();
    if (p == 0) return 0;
    vector<int> next(p, -1); // -1表示不存在相同的最大前缀和后缀12.5 练习
    calNext(needle, next); // 计算next数组
    for (int i = 0; i < n; ++i)
    {
        while (k > -1 && needle[k+1] != haystack[i])
        {
            k = next[k]; // 有部分匹配,往前回溯
        }
        if (needle[k+1] == haystack[i])
        {
            ++k;
        }
        if (k == p-1)
        {
            return i - p + 1; // 说明k移动到needle的最末端,返回相应的位置
        }
    }
    return -1;
}
// 辅函数 - 计算next数组
void calNext(const string &needle, vector<int> &next)
{
    for (int j = 1, p = -1; j < needle.length(); ++j)
    {
        while (p > -1 && needle[p+1] != needle[j])
        {
            p = next[p]; // 如果下一位不同,往前回溯
        }
        if (needle[p+1] == needle[j])
        {
            ++p; // 如果下一位相同,更新相同的最大前缀和最大后缀长
        }
        next[j] = p;
    }
}


相关文章
|
11月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
10月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
254 0
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
463 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
339 0
|
算法
KMP算法
KMP算法
241 0
|
算法
KMP算法
KMP算法
167 0
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
人工智能 算法 BI
一篇文章讲明白KMP算法(俗称看毛片算法)
一篇文章讲明白KMP算法(俗称看毛片算法)
367 0
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法

热门文章

最新文章