KMP算法

文本串:aabaabaaf

模式串:aabaaf

  • 前缀:包含首字母,但是不包含尾字母的所有连续子串

以模式串作为例子:

a

aa

aab

aaba

aabaa

  • 后缀 :只包含尾字母,不包含首字母的所有的连续子串

以模式串作为例子:

f

af

aaf

baaf

abaaf

如何求最长相等前后缀长度 ?

以模式串(aabaaf)作为例子:

a : 0

aa: 1

aab : 0

aaba: 1

aabaa:2

aabaaf : 0

前缀表是模式串用来回退的,它记录了模式串与文本串不匹配的时候,模式串应该从哪里开始重新匹配

前缀表里面存放的是最长相等前后缀的长度

用上面的例子,前缀表就是 010120

当模式串aabaaf与文本串在f的位置匹配冲突时, 去找最长前后缀相等的长度 ,长度就是需要跳转的下标

next数组 :里面存放的元素就是前缀表 ,可能会对前缀表进行调整,具体例子具体分析

按照前后缀的定义来说,一个字符是没有前后缀的,至少得有两个字符才能比较前后缀的异同
如果是两个字符,前缀末位下标就是0,后缀末位下标就是1

leetcode28题为例

cpp 复制代码
class Solution 
{
public:
    void getNext(vector<int> &next, const string& s) 
    {

        //按照前后缀的定义来说,一个字符是没有前后缀的,至少得有两个字符才能比较前后缀的异同
        //两个字符,前缀末位下标就是0,后缀末位下标就是1

        //初始化
        int j = 0;
        next[0] = j;
        for (int i = 1; i < s.size(); i++)
        {
            // 前后缀不同
            while (j > 0 && s[i] != s[j]) 
            {
               // j向前回退
                j = next[j - 1];
            }
            //相同的前后缀
            if (s[i] == s[j])
            {
                j++;
            }
            // 将j(前缀的长度)赋给next[i]
            next[i] = j;
        }
    }
    int strStr(string haystack, string needle) 
    {
        if (needle.size() == 0)
        {
            return 0;
        }
        vector<int> next;
          next.resize(needle.size());
        getNext(next, needle);
        int j = 0;
        for (int i = 0; i < haystack.size(); i++) 
        {
            while (j > 0 && haystack[i] != needle[j]) 
            {
                j = next[j - 1];
            }
            if (haystack[i] == needle[j]) 
            {
                j++;
            }
            if (j == needle.size())
            {
                return (i - needle.size() + 1);
            }
        }
        return -1;
    }
};

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!

相关推荐
xyq2024几秒前
Highcharts 曲线图:深度解析与实战应用
开发语言
Liangwei Lin几秒前
LeetCode 48. 旋转图像
算法
顾温3 分钟前
协程结束——实测
开发语言·unity·c#
Byron Loong4 分钟前
【逆向】AT Hook 与 Inline Hook 对比
c语言·汇编·c++
AGV算法笔记6 分钟前
【具身智能研究进展】RoboBrain 2.5:让机器人真正理解“空间”和“时间”的大脑模型
算法·3d·机器人·具身智能·感知算法
love在水一方10 分钟前
【InternNav】 工程详细分析
人工智能·算法·机器学习
ch.ju25 分钟前
Java程序设计(第3版)第二章——函数的递归
java·开发语言
奔跑的蜗牛FelixChioa27 分钟前
python异常处理机制详解
开发语言·python
tankeven35 分钟前
C++ 算法类
c++
其实防守也摸鱼36 分钟前
ctfshow--Crypto(crypto1-14)解题步骤
java·开发语言·网络·安全·密码学·ctf·ctfshow