首页 > 编程语言 >KMP算法学习记录

KMP算法学习记录

时间:2022-08-27 16:00:40浏览次数:68  
标签:return 记录 ++ nextval next int 算法 KMP else

KMP算法

作用:用于字符串匹配。

1 准备

前缀:指不包含最后一个字符的所有以第一个字符开头的连续子串。
后缀:指不包含第一个字符的所有以最后一个字符结尾的连续子串。
next[](前缀表):最长前后缀数组。
j是从1开始的;

2 实现

2.1 求next[]

//如果相等长度+1
if(needle[i] == needle[j]){                
      j++;
      next[i] = j;      
  }else{
  //回退
      j = next[j - 1];
  }

完整代码

  vector<int> get_next(string& t){
      vector<int> next(t.size(), -1);
      /*
      j的初始值为-1,值整体右移一位,
      这样j对应的位置就是他应该回退的坐标,否则他的前一位才是应该回退的值
      */
      int i= 0, j = -1; 
      while(i < t.size() - 1){
          if(j == -1 || t[i] == t[j]){                
              j++;
              i++;
              next[i] = j;
              
          }else{
              j = next[j];
          }
      } 
      return next;   
     }

2.2 匹配算法

int strStr(string s, string t) {
    if (t.length() == 0) {
        return 0;
    }
    int n = s.length();
    int m = t.length();
    vector<int> next = get_next(t);
    int i = 0, j = 0;
    while( i < n && j < m){
        if(j == -1 || s[i] == t[j]){                
            j++;
            i++;       
        if (j == m ) return i - m ;
        }else{
            j = next[j];
        }

    } 
    //未找到返回-1
    return -1;
}

3 改进next[]


我们发现2 3 4 5都是多余的判断,因此next[]得到了改良 nextval[]。

vector<int> get_nextval(string& t){
    vector<int> nextval(needle.size(), -1);      

    int i= 0, j = -1; 

    while(i < t.size() - 1){
        if(j == -1 || t[i] == t[j]){                
            j++;
            i++;
            //如果与s[next[i]]相等则取之前的值
            if(t[i] == t[j]){
                nextval[i] = nextval[j]; 
            }else{
              //如果不等,取现在的值
               nextval[i] = j; 
            }
            
            
        }else{
            j = nextval[j];
        }
    } 

    return nextval;   
}

匹配代码不需要改动,只需要next[]替换为nextval[]即可。

标签:return,记录,++,nextval,next,int,算法,KMP,else
From: https://www.cnblogs.com/leeeeee/p/16630751.html

相关文章

  • 常见算法题
    Golang//求2个很大数之和funcmaxNumSum(astring,bstring)string{ size:=0 alen:=len(a) blen:=len(b) ifalen>blen{ size=alen }else{ si......
  • 关于qtableview开发过程中的一些记录
    使用QTableWidget刷新数据后,经常会自动展示为table首行。为了显示刷新数据前所在的位置,解决办法如下:     先记住滚动条位置,刷新数据后,再重置滚动条位置。伪代码如......
  • dragonfly 蜻蜓算法 学习笔记
    1、GettingStated1.1CommandLine使用方法:在pycharm中:cdexamplepython..\bin\dragonfly-script.py--configxxx.json--optionxxx.txt1)BasicUse全局优化......
  • mysql-开启日志记录功能
    开启日志记录功能--开启功能SETGLOBALgeneral_log=ON;--保存到文件SETGLOBALlog_output='file';查看日志内容--查看日志保存位置及开启状态showvariab......
  • 褶积方法制作合成地震记录c++
    地震褶积方法制作合成地震记录包括,(1)读取相模型,设置每种相的密度和速度,(2)计算反射系数,添加噪音,(3)设置子波,(4)进行褶积计算。具体的代码如下voidsyntheticSeis(conststring&......
  • 算法题python用法
    算法题python用法大写变小写往后移动一位chr(ord(v.lower())+1)大写、小写、数字i.isalpha():#英文i.isspace()#空格​ifitem.isupper():#大写     a......
  • 面试题做错记录(开卷)
    #JavaScript是一门单线程的静态类型语言错,是动态类型语言#浏览器中的Cookie只能由服务端写入,并且每次网络请求会自动携带Cookiecookie可以在本地用js方法新......
  • 算法题
    回文字符串Manacher算法字符串aaabaLen数组有一个性质,那就是Len[i]-1就是以第i个字符为中心的回文子串在原字符串S中的长度。......
  • 2022 跳坑(或妙计)记录
    P7143[THUPC2021初赛]线段树有恒等式\[\sum_{i=1}^ni(n+1-i)=\binom{n+2}{3}\]左式为\(n\)长度所有子串长度和。组合理解:我们将\([0,n+1]\)共\(n+2\)个位置......
  • 做题记录
    CF\(\color{#aa00aa}{1900}\sim\color{#ff0000}{2400}\)|AT\(\color{#0000ff}{1600}\sim\color{#c0c000}{2399}\)做题笔记前言准备多刷些这个分数段的CF/AT以涨知......