当前位置: 首页 > 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;
}

--

相关文章:

  • 【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 处理异步操作?
  • 盛和资源海外找稀土矿提速:拟超7亿元收购匹克,加快推动坦桑尼亚项目
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖
  • 从普通人经历中发现历史,王笛解读《线索与痕迹》
  • 训练孩子的科学思维,上海虹口推出“六个一百”旗舰工程
  • 《淮水竹亭》:一手好牌,为何打成这样
  • 西藏日喀则市拉孜县发生5.5级地震,震感明显部分人被晃醒