模式串匹配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模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...
随机推荐
- LA 3708 Graveyard(推理 参考系 中位数)
Graveyard Programming contests became so popular in the year 2397 that the governor of New Earck -- ...
- OI路上-NOIP100天冲刺计划
学OI已经9个月了,可是自己水平还是那样的弱QWQ. 现在离NOIP还有差不多100天的时间. 晚上辗转反侧发现了自己的一些问题: (1)DP还经常没思路. (2)搜索恶心题还不想写. (3)有时候也 ...
- VS中使用sqlite静态连接
说明 最近写的文章有些多,懒得打字了,就直接上文章.这里说明一下,我说的是VS,不是指定的哪一个VS版本.先下载官方的源文件:sqlite-amalgamation-3071502.zip 下载下来的 ...
- (转)Libevent(4)— Bufferevent
转自:http://name5566.com/4215.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...
- 深入理解Python中的生成器
生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束. 生成器语法 生成器表达式: 通列表解 ...
- mkpasswd
-l # (length of password, default = 7) 指定密码的长度,默认是7位数 -d # (min # of dig ...
- 使用sqlmap注入DVWA的SQL Injection菜单
1 使用sqlmap注入DVWA的SQL Injection菜单 本教程中的登陆地址:http://192.168.0.112/dvwa/login.php 1.1 获取cookie信息 1) 使用a ...
- 【原创】Linux 内核模块编程
sudo gedit hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linu ...
- Java中静态代码块,代码块,构造方法的理解
直接贴代码 class A { static { System.out.println("父类静态代码区"); } { System.out.println("父类代码区 ...
- 深入了解relative
1.relative是自身定位,距原本位置的偏移 2.无侵入布局: 挪动位置,原本位置还在占据,并不会影响其他元素的布局 应用: 实现鼠标拖拽,比自身api好用 3.top/bottom 和 le ...