当前位置: 首页 > news >正文

leetcode28 找出字符串第一个匹配值的下标 KMP算法

KMP 算法——快速的从主串中找到模式串

当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

KMP 算法 比较指针不回溯,仅仅是后移模式串。

每次不匹配的时候,找之前已匹配部分中,模式串的最长公共前后缀

前缀与后缀相同,所以T里面与P的后缀a匹配的那个a一定也与P中的前缀a匹配,所以直接从前缀后面的b开始匹配就行了

也就是碰到某个不匹配的时候,我这个模式串要从最长前缀后滑动到最长后缀的位置(其实就是比较指针 j 从最长前缀移动到最长后缀的位置)。而保存这个位置的数组就是 next 数组。

next数组——前缀表(prefix table)

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

next数组既可以就是前缀表,也可以是前缀表统一减一(右移一位,初始位置为-1)。

帮你把KMP算法学个通透!(求next数组代码篇)_哔哩哔哩_bilibili

构造next数组:

定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。定义一个函数getNext来构建next数组,函数参数为指向next数组的指针,和一个字符串。

int* next 的含义

void getNext(int* next, const string& s);
  • int* next 是一个指向整型数组的指针。

  • 它表示 next 是一个数组,而不是单个整数。

  • 在函数内部,可以通过 next[i] 访问数组的第 i 个元素。

getNext(&next[0], needle); 的语义

  • next 是一个整型数组,例如 int next[10];

  • &next[0] 是数组 next 的首地址,类型是 int*

  • 通过 int* next 参数,函数可以访问和修改整个数组。

next数组里存储的是对应位置最长公共前后缀值、当前后缀不相同时j回退到next[j-1]值对应坐标(需要j大于等于1时)。相同时j++更新next。

 

class Solution {
public:
    //求next数组
    void getNext(int* next, const string& s){
        //初始化
        int i = 1;//后缀末尾位、主串所在
        int j = 0;//前缀末尾位、最长公共前后缀长度
        next[0] = 0;

        for(int i = 1; i<s.size(); i++){
            while(j >= 1 && s[i] != s[j]){
                j = next[j-1];//当前后缀不相同,j回退到next[j-1]值对应坐标
            }
            if(s[i] == s[j]){
                j++;//前后缀相等最长公共前后缀长度+1、准备比较下一位是否相等
            }
            next[i] = j;//更新next数组值
        }
    }
    int strStr(string haystack, string needle) {
        if(needle.size() == 0){
            return 0;
        }
        vector<int> next(needle.size());
        getNext(&next[0], 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;
    }
};

相关文章:

  • android 文本控件显示滑动条并自动滑动到最底部
  • 初识 Node.js
  • 微服务学习(1):RabbitMQ的安装与简单应用
  • 2025-03-01 学习记录--C/C++-C语言 整数类型对比
  • Lua | 每日一练 (4)
  • JVM虚拟机的深入浅出
  • 数据结构1-4 队列
  • 云原生架构篇——Kubernetes弹性伸缩与Service Mesh实践
  • 在Linux上安装go环境
  • IP-----双重发布
  • 算法-数据结构(图)-弗洛伊德算法复现(Floyd)
  • 袋鼠数据库工具 6.4 AI 版已上线
  • [AI机器人] Web-AI-Robot机器人前瞻版--比奇堡海之霸凯伦
  • Acwing 哞叫时间II
  • 时间复杂度练习题(6道题,C语言)
  • 性能调优篇——索引优化与执行计划解析
  • 虚拟机及网络配置
  • Xshell客户端免费版无需注册Linux连接客户端8.0详细安装教程(2025年最全最详细的图文教程)附安装包
  • 2.6作业
  • 分享一套适合做课设的SpringBoot商城系统
  • 专业的天津网站建设/百度站长工具app
  • 怎么查询网站是谁做的/短视频营销策略
  • 南京网站制作公司怎么样/线上推广策略
  • 做网站域名选择/优化网站价格
  • 海沧网站制作/微信crm管理系统
  • 郑州做网站找维诺/常见的网络营销方式