模式串匹配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模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...
随机推荐
- 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)
MVC 1. 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...
- jQuery弹性滑块导航
曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...
- LA 3516(ZOJ 2641) Exploring Pyramids(递推 DP)
Exploring Pyramids Archaeologists have discovered a new set of hidden caves in one of the Egyptian p ...
- (转)Libevent(3)— 基础库
转自:http://name5566.com/4202.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...
- (转) UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
首先,视图控制器必须得实现协议UIAlertViewDelegate中的方法,并指定delegate为self,才能使弹出的Alert窗口响应点击事件. 具体代码如下: #import <UIK ...
- Kali linux网络配置
Kali linux 安装完成后,需要对其网络进行配置.使用DHCP服务是配置网卡最简单的方法之一,但渗透测试时通常不会这样做,因为系统会被记录在DHCP服务器的数据库中. 1 动态DHCP方式 配 ...
- nginx Engine X静态网页服务器介绍
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 反向代理(Reverse Proxy)方 ...
- CentOS 6.5-默认没开启网络连接:开启网络连接
vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改网络, 禁止IP6开启,禁止自启动服务chkconfig
- 理解依赖注入(IOC)和学习Unity
资料1: IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...
- Android App资源的查找过程分析
Android资源管理框架实际就是由AssetManager和Resources两个类来实现的.其中,Resources类可以根据ID来查找资源,而AssetManager类根据文件名来查找资源.事实 ...