KMP
时间:2021-08-20
本文章向大家介绍KMP,主要包括KMP使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
应用:在字符串中查找子串,求循环节长度等。
字符串匹配:
暴力思想,枚举每一个每一个文本串元素,然后从这一位开始不断向后比较,每次比较失败之后都要从头开始重新比对,复杂度易被卡成 \(O(nm)\) 。
而对于 KMP 算法,在每次失配之后,不会从头重新开始枚举,而是根据已得知的数据,从失配后的特定位置开始匹配,使复杂度优化至 \(O(n+m)\).
适配后的特定位置:失配数组(见这里)
code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char a[N],b[N];int k[N],la,lb;//k数组即为失配数组
int main()
{
scanf("%s%s",a+1,b+1);
la=strlen(a+1),lb=strlen(b+1);
int j=0;
for(int i=2;i<=lb;i++)
{
while(j/*如果回跳到第一个字符就不用再回跳了*/&&b[j+1]!=b[i]) j=k[j];
if(b[j+1]==b[i]) j++;//通过自己匹配自己来得出每一个点的kmp值
k[i]=j;//i+1失配后跳的地方
}j=0;
for(int i=1;i<=la;i++)
{
while(j&&b[j+1]!=a[i]) j=k[j];//如果失配 ,那么就不断向回跳,直到可以继续匹配
if(b[j+1]==a[i]) j++;//如果匹配成功,那么对应的模式串位置加1
if(j==lb) printf("%d\n",i-lb+1),j=k[j];
}
for(int i=1;i<=lb;i++) printf("%d ",k[i]);
return 0;
}
循环节长度: len-kmp[len]
code:
void KMP()
{
for(int i=1;i<len;i++)
{
while(j>0&&a[j+1]!=a[i+1]) j=kmp[j];
j=a[j+1]==a[i+1]?j+1:j;
kmp[i+1]=j;
}
cout<<len-kmp[len];
}
\(\texttt{End.}\)
原文地址:https://www.cnblogs.com/Juruo-lxgw/p/KMP.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring boot多数据源的代码实现
- 树莓派基础实验13:雨滴探测传感器实验
- Java中的TCP通信程序
- Java实现一个简单的文件上传案例
- 树莓派基础实验14:PS2操纵杆实验
- Java反射
- Java Request(域对象+请求转发+原理)详解
- PHP命令执行学习总结
- win10 专业版 提示开机提示你的windows许可证即将过期
- 浅谈文件上传漏洞(其他方式绕过总结)
- 《sql必知必会》——读书笔记(1)
- JDK15已发布,网友:我还在JDK8踏步走...
- 树莓派基础实验15:电位器传感器实验
- java JDBC数据库连接池技术(Druid ,c3p0)
- Fail to start qos server: dubbo version: current host: java.net.BindException: