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

leetcode day25 28 KMP算法

28找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1

解题思路:KMP算法。不相等j回退到前一个位置的next[j-1],相等j++;next[i]=j;

具体步骤如下

m为匹配串p长度,n为要匹配的长串s长度

1、确定前缀表next的值,初始化next[0]=0

j为前缀末尾,i为后缀末尾,初始j=0,i=1

for(i=1;i<m;i++){

    while(j>0&&p[i]!=p[j])j=next[j-1];//回退冲突的前一个位置

    if(p[i]==p[j])j++;

    next[i]=j;

}

2、匹配过程

 for(i=0,j=0;i<n;i++){

        while(j>0&&s[i]!=p[j])j=next[j-1];

        if(s[i]==p[j])j++;

        if(j==m)return i-m+1;

    }

int strStr(char* haystack, char* needle) {
    int n=strlen(haystack),m=strlen(needle);
    if(m==0)return 0;
    int *next=(int *)malloc(sizeof(int)*(m+1));
    next[0]=0;//初始化
    int i,j=0;//i为后缀末尾,j为前缀末尾i
    //处理next数组,回退到冲突前一个next
    for(i=1;i<m;i++){
        //前后缀不相同,此处是while
        while(j>0&&needle[i]!=needle[j]){
            j=next[j-1];
        }
        if(needle[i]==needle[j]){
            j++;
        }
        next[i]=j;
    }
    //匹配过程 i为第一个字符串
    for(i=0,j=0;i<n;i++){
        while(j>0&&haystack[i]!=needle[j])j=next[j-1];
        if(haystack[i]==needle[j])j++;
        if(j==m)return i-m+1;
    }
    return -1;
}

--

http://www.dtcms.com/a/52160.html

相关文章:

  • 【ESP-ADF】在 VSCode 安装 ESP-ADF 注意事项
  • 统计建模小贴士
  • Maven 中 SNAPSHOT 版本与 RELEASE 版本的区别
  • C#+Halcon 垂直拼接/裁切避免频繁开辟内存
  • 如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
  • 基于PyTorch的深度学习3——Tensor与Autograd
  • DApp开发从入门到精通:以太坊/Solana公链生态实战解析
  • 学习工具的一天之(burp)
  • 第5章 使用OSSEC进行监控(网络安全防御实战--蓝军武器库)
  • 数据库设计方面如何进行PostgreSQL 17的性能调优?
  • 优化cache利用、减少cache miss的方法
  • Dify 1.0.0 使用体验
  • 设备管理系统功能与.NET+VUE(IVIEW)技术实现
  • 《计算机网络》—— 题目训练(一)
  • ZYNQ-PL学习实践(四)IP核之读写RAM
  • 前端如何判断对象为空
  • 使用JMeter(组件详细介绍+使用方式及步骤)
  • 阿里云 linux centos7安装nacos
  • # Word2Vec与多义词表示:静态嵌入的优势与局限
  • 解释 Node.js 中的异步编程模型,如何使用回调、Promise 和async / await 处理异步操作?
  • 清北deepseek8本手册
  • Spark的算子
  • 250302-绿联NAS通过Docker配置SearXNG及适配Open-WebUI的yaml配置
  • Time Interval Aware Self-Attention for Sequential Recommendation
  • 2025-03-05 学习记录--C/C++-PTA 习题5-7 使用函数求余弦函数的近似值
  • WindowManagerService之Window类型篇
  • 【资料分享】清华大学-187页:AIGC发展研究3.0版
  • Mysql 数据库免费使用
  • Java高频面试之集合-03
  • unity6 打包webgl注意事项