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

KMP算法数组下标从0和数组下标从1开始

我在运用KMP时,总时会搞混如果数组下标为0时要如何用写,下标为1时要如何写。

当下标为0时kmp

void kmp(int len)
{//下标为0 时vector<int> f(n,-1);for(int i = 1;i < len;i++){ // 每次更新的是 下标i //  当第 i+1不匹配是 跳到 f[i]的位置上,看小标为 s[f[i]+1] == s[i] 不等可以继续跳 int j = f[i-1];while(j != -1 && s[j+1] != s[i]){s[j] = f[j];}if(s[j+1] == s[i]){f[i] = j+1;}else{f[i] = j;}}
}

当下标为1时,KMP算法:

#include<iostream>
#include<cstring>
#define MAXN 1000010
using namespace std;
int kmp[MAXN];
int la,lb,j; 
char a[MAXN],b[MAXN];
int main()
{cin>>a+1;cin>>b+1;la=strlen(a+1);lb=strlen(b+1);for (int i=2;i<=lb;i++){     while(j&&b[i]!=b[j+1])j=kmp[j];    if(b[j+1]==b[i])j++;    kmp[i]=j;}j=0;for(int i=1;i<=la;i++){while(j>0&&b[j+1]!=a[i])j=kmp[j];if (b[j+1]==a[i]) j++;if (j==lb) {cout<<i-lb+1<<endl;j=kmp[j];}}for (int i=1;i<=lb;i++)cout<<kmp[i]<<" ";return 0;
}

其实基本一样的只是一个初始化为-1,一个初始化为0。而next中记录的意义为前缀字符串和后缀字符串的长度,当i+1不匹配时,可以跳到 next[i] (因为next[i] 在进行 next[i]+1 是否配对成功)

还有一种是 在 KMP 中是记录next[i+1]的下标。

void getNext(char *p,int plen)
{// 记录 i+1 的跳的位置 Next[0]	= 0;Next[1] = 1;for(int i = 2;i < plen;i++){int j = Next[i];while(j&&p[i] != p[j]){j = Next[j];}if(p[i] == p[j]){Next[i+1] = j+1;}else{Next[i+1] = 0;}}
} 

这种Next是直接记录当i不匹配时,直接跳到下标为Next[i]进行配对,它记录的是Next 时最长前缀 和最长后缀的长度后 ,最长前缀的长度还+1。所以直接比较Next[i]就可以了。

相关文章:

  • Windows 批量删除文件简单方法
  • k8s 安装 Longhorn
  • Java设计模式-单例(Singleton)设计模式的概述及实现
  • 〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则
  • 【JVM】第一章:内存结构
  • ES6之Symbol
  • FFmpegd的AVBSF
  • 学习Node.js与Webpack总结
  • C++之函数指针
  • java对二维数组进行排序
  • web服务器之——www服务器的基本配置
  • 学习JVM
  • 网络游戏APP备案|游戏
  • Android 消息分发机制解读
  • 机器学习-SVM(支持向量机)
  • python3.6+scrapy+mysql 爬虫实战
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Android单元测试 - 几个重要问题
  • jQuery(一)
  • mac修复ab及siege安装
  • mysql外键的使用
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React16时代,该用什么姿势写 React ?
  • Vue全家桶实现一个Web App
  • 记一次和乔布斯合作最难忘的经历
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前言-如何学习区块链
  • 人脸识别最新开发经验demo
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微信小程序:实现悬浮返回和分享按钮
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​第20课 在Android Native开发中加入新的C++类
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #pragam once 和 #ifndef 预编译头
  • #微信小程序:微信小程序常见的配置传值
  • (0)Nginx 功能特性
  • (pytorch进阶之路)扩散概率模型
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (理论篇)httpmoudle和httphandler一览
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (转)甲方乙方——赵民谈找工作
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .htaccess配置常用技巧
  • .NET CLR Hosting 简介
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .Net 垃圾回收机制原理(二)
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET中winform传递参数至Url并获得返回值或文件
  • @angular/cli项目构建--Dynamic.Form
  • @Bean注解详解