博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法
阅读量:6975 次
发布时间:2019-06-27

本文共 971 字,大约阅读时间需要 3 分钟。

北大先修课挂了……挂在了C++的字符串上,一时心血来潮学了KMP。(本文内容来自M67)

KMP是用来进行字符串匹配的算法,对于两个字符串A和B,它通过预处理B串加快匹配速度。

我们假设有A:124123678  B:123。

我们用i、j两个指针表示当前处理的A和B的字符下标。如果A[i+1]=B[j+1],i++,j++。

如果不同怎么办呢?容易想到,对i进行操作是没有意义的。我当然要一路向后扫描A串,所以我们希望找到能匹配A[i+1]的最大的B[j+1]。

这个B[j]可以用预处理算出,记为p[j]。我们既然希望保留最大的B[j+1],那么B[1..p[j]]应当等于B[j-p[j]+1..j],之后i++。

我们可以发现,P数组的计算实际上就是B串的自我匹配,因此和A、B串匹配类似。

例题:codevs1204

#include
#include
#include
using namespace std;int p[200];int main(){ string a,b; cin >> a >> b; int n=a.length(),m=b.length(); a=" "+a; b=" "+b; int j=0; for(int i=2;i<=m;i++) { while (j>0 && b[j+1]!=b[i]) j=p[j]; if (b[j+1]==b[i]) j++; p[i]=j; } j=0; for (int i=1; i<=n; i++) { while (j>0 && a[i]!=b[j+1]) j=p[j]; if (b[j+1]==a[i]) j++; if (j==m) { cout << i-j+1 << endl; return 0; } } return 0;}

 

转载于:https://www.cnblogs.com/Shymuel/p/4471477.html

你可能感兴趣的文章
reportNG定制化之失败截图及日志
查看>>
Getting Started with xUnit.net (desktop)
查看>>
myeclipse快捷键大全
查看>>
新建silverlight项目提示未将对象设置到实例解决方案
查看>>
tmux/screen里面如何用鼠标滚轮来卷动窗口内容
查看>>
(链表)反转链表Reverse List
查看>>
ArduinoYun教程之通过网络为Arduino Yun编程
查看>>
SSH连接不上Linux的解决方法
查看>>
HTML5学习笔记二 HTML基础
查看>>
mysql子查询
查看>>
JAVA并发编程J.U.C学习总结
查看>>
[转]cocos2d-js 3.0 屏幕适配方案 分辨率适应
查看>>
POM.xml 标签详解
查看>>
谈谈Boost网络编程(2)—— 新系统的设计
查看>>
Linux终端的几个常用快捷方式,记下!
查看>>
JS nodeType返回类型
查看>>
Hanoi塔问题
查看>>
安装Ecshop首页出现报错:Only variables should be passed by referen
查看>>
Android组件系列----BroadcastReceiver广播接收器
查看>>
Maven学习笔记(二) :Maven的安装与配置
查看>>