模式串匹配KMP详解
关于KMP模式串匹配网上蛮多的.
对于KMP有自己理解所以写下来希望能够对你们的学习有帮助.
之前暑假的时候学过,然后好长时间没用发现又忘了,现在再看看发现有了新的理解.
======================================================================
1.关于KMP的next数组的问题.
相信很多童鞋会迷在这里,next到底是干什么的?
next保存的是第i个位置前缀串和后缀串第一个字符不相同的位置.
下面我们来画图理解一下
next[11] = 4
next[11]也就是k的位置,下面我们来解释一下为什么K的next为什么是4
首先是前缀串和后缀串, 我们是以K前面的位置开始,来进行匹配,可以看我们串的红色部分,就分别是我们的前缀串(从字符串开头到C的前一个位置为前缀串)和后缀串.
K的next就是最先不匹配的位置.也就是C了, C的下标就是4.
2.知道了next然后我们如何去匹配呢??
上我们的第二张图
.
解释一下:
第一次串匹配,当我们匹配到i的位置的时候,我们会判断i和主串的相应位置是否匹配.如果匹配继续向下匹配,如果不匹配则按照下面的规则进行.
在不匹配的情况下:按照传统的模式串匹配我们要从第一个串的位置开始要重新进行匹配.
但是现在我们并不需要从第一个位置开始了.要从什么位置开始呢?从我们的next[i]的位置重新开始匹配就行了.
第二次串匹配:第二次串匹配就是从next[i]的位置重新开始匹配. 因为我们知道前缀串和后缀串是一样的,因此我们的重新匹配的位置就不需要大的改动了.
=================================================================================
下面就是代码的实现:
- #include<stdio.h>
- #include<string.h>
- #define maxn 1000
- void GetNext(int next[],char T[])
- {
- int len = strlen(T), i = , j = -;
- next[] = -;
- while(i < len)
- {
- if(j == - || T[i] == T[j])//说明 next[i]要更新
- {
- i ++;
- j ++;
- next[i] = j;
- }
- else
- j = next[j];
- }
- }
- int KMP(char S[],char T[])
- {
- int next[maxn], i = , j = ;
- int lenS = strlen(S);
- int lenT = strlen(T);
- GetNext(next, T);
- while(i < lenS && j < lenT)
- {
- if(j == - || S[i] == T[j] )
- {
- i ++;
- j ++;
- }
- else
- {
- j = next[j];
- }
- }
- if(j == lenT)
- return i-j;
- return -;
- }
- int main()
- {
- char S[maxn], T[maxn];
- scanf("%s %s",S, T);
- int ans = KMP(S,T);
- printf("%d\n", ans);
- return ;
- }

模式串匹配KMP详解的更多相关文章
- KMP详解之二
KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...
- Javascript 严格模式(strict mode)详解
Javascript 严格模式详解 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Ja ...
- binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...
- kmp(详解)
大佬博客:https://blog.csdn.net/lee18254290736/article/details/77278769 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达 ...
- Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...
- 字符串模式匹配算法--BF和KMP详解
1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续 (如:abc 是abcdef的子串) ...
- KMP详解
原文: http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 1. 引言 本KMP原文最初写于2年多前的2011年12月, ...
- mysql中binlog_format模式与配置详解
mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...
- PHP正则表达式模式修饰符详解
PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...
随机推荐
- mediawiki数据库的下载地址及导入方法
mediawiki导入数据库 数据库下载:http://zh.wikipedia.org/wiki/Wikipedia:%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%8B%E8% ...
- OC - 9.使用Quartz2D绘制下载进度条
效果图 实现思路 要实现绘图,通常需要自定义一个UIView的子类,重写父类的- (void)drawRect:(CGRect)rect方法,在该方法中实现绘图操作 若想显示下载进度,只需要实例化自定 ...
- [转]SQL语句:Group By总结
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 ...
- Codevs 1507 酒厂选址
1507 酒厂选址 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒 ...
- 2016.08.07计算几何总结测试day2
T1 bzoj: [Usaco2010 OPen]Triangle Counting 数三角形 看到这个题n那么大, 于是想到极角排序搞一搞,然而排完序后立马懵逼,完全不知道接下来应该怎么写.... ...
- Headfirst设计模式的C++实现——命令模式(Command)
先看如果不用命令模式的实现: light.h #ifndef _LIGHT_H_ #define _LIGHT_H #include <iostream> class LIGHT { pu ...
- ubuntn svn 安装 配置
参考文章 http://zhan.renren.com/itbegin?gid=3602888498033631485&checked=true 上面的文章说得很详细 sudo apt-ge ...
- 禁止选择文本和禁用右键 v2.0
禁止鼠标右键(注:在火狐浏览器没有起到效果作用) <script> function stop() { return false }; document.oncontextmenu = s ...
- yii2单独给input或者其他标签定义class
<?= $form->field($model, 'price5', ['options' => ['class' => 'col-sm-6']])->textInput ...
- networkRequest
void TPHttp::applyResource(){ QJsonObject json; json.insert("ProductCode","MoVd ...