首页 > 编程语言 >KMP算法

KMP算法

时间:2024-01-31 11:55:37浏览次数:19  
标签:slowptr int needle next 算法 KMP haystack fastptr

目录

kmp已经整了很多次了,从一开始的不懂到之前一次的似懂非懂,这次再刷字符串算法,一定搞懂

寄,又有点糊里糊涂的

感悟

有点晕,next数组和整体的顺序上已经理解了
存在的问题

  1. 用next数组查找的时候要用while循环去查找,因为如果用if来查找,匹配到本次不一样,回退后仍然可能不一样所以要用while直到一样或者结束

  2. next数组的构建过程中同样要用while做循环检测,然后slowptr=next[slowptr-1]

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n=haystack.length();
        int m=needle.length();
        
        vector<int> next(m,0);
        int slowptr=0;
        int fastptr=1;
        for(;fastptr<m;fastptr++)
        {
            while(slowptr>0&&needle[fastptr]!=needle[slowptr])
            {
                slowptr=next[slowptr-1];
            }
            if(needle[fastptr]==needle[slowptr])
            {
                next[fastptr]=slowptr+1;
                slowptr++;
            }
        }
        for(int 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;
    }
};

标签:slowptr,int,needle,next,算法,KMP,haystack,fastptr
From: https://www.cnblogs.com/liviayu/p/17998942

相关文章

  • eXeScope 注册机制算法破解
    使用x64dbg进行修改从网上找来一片文章,感觉靠谱,如下---------------------------------------------------------------------------------------第一次看到这个界面还是在十多年前,当时的我并不明白这些数据的含义。现在为它写一篇博客,算是一种纪念吧。用x64dbg加载exescop......
  • 算法学习Day44完全背包
    Day44完全背包ByHQWQF2024/01/29笔记完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。和01背包的区别在每件物品都可以放入背包无......
  • 算法学习Day43最后石头的重量、目标和、一和零
    Day43最后石头的重量、目标和、一和零ByHQWQF2024/01/31笔记1049.最后一块石头的重量II有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x和 y,且 x<=y。那么粉碎的可能结果如下:如果 x==y,那么两块石......
  • 【学习笔记】根号算法
    1.分块【模板】线段树1我们把整个序列割成\(s\)个块,则块长为\(\frac{n}{s}\),对于一个跨越区间\([l,r]\)的修改/询问,很容易看出它最多包含两个散块,然后中间有一堆整块。考虑对于整块我们类似线段树的维护方法打tag,然后对于散块直接暴力。分析复杂度,最多有\(s\)个块,散......
  • 代码随想录算法训练营第三天 |203.移除链表元素 , 707.设计链表,206.反转链表
    206.反转链表 已解答简单 相关标签相关企业 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链......
  • 代码随想录算法训练营第七天| 454.四数相加II 383. 赎金信 15. 三数之和 18. 四
    454.四数相加II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0题目链接:454.四数相加II-力扣(LeetCode)思路:当遇到需要确认元素是......
  • 类欧几里得算法
    模板题:P5170【模板】类欧几里得算法复述题解:我们记\(f(a,b,c,n)=\sum\limits_{i=0}^{n}\Big\lfloor\dfrac{ai+b}{c}\Big\rfloor\,,\g(a,b,c,n)=\sum\limits_{i=0}^{n}i\Big\lfloor\dfrac{ai+b}{c}\Big\rfloor\,,\h(a,b,c,n)=\sum\limits_{i=0}^{n}{\Big\lfloor......
  • PBKDF2算法:保护密码安全的重要工具
    摘要:在当今的数字世界中,密码安全是至关重要的。为了保护用户密码免受未经授权的访问和破解,Password-BasedKeyDerivationFunction2(PBKDF2)算法成为了一种重要的工具。本文将介绍PBKDF2算法的优缺点,以及它如何解决密码存储和验证中的一些问题。我们还将提供一个使用Java编......
  • 【机器学习】常见算法详解第2篇:KNN之kd树介绍(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚......
  • 白话机器学习算法入门笔记
    机器学习中常见的十大算法包括:1.线性回归(LinearRegression)-用于预测连续值的简单线性回归模型。2.逻辑回归(LogisticRegression)-用于分类问题的logistic回归模型。3.决策树(DecisionTree)-一种流行的树形分类与回归方法。4.支持向量机(SVM)-一种二分类模型,Fi......