关于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详解的更多相关文章

  1. KMP详解之二

    KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句 ...

  2. Javascript 严格模式(strict mode)详解

    Javascript 严格模式详解   一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Ja ...

  3. binlog之四:mysql中binlog_format模式与配置详解,binlog的日志格式详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  4. kmp(详解)

    大佬博客:https://blog.csdn.net/lee18254290736/article/details/77278769 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达 ...

  5. Android严苛模式StrictMode使用详解

    StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...

  6. 字符串模式匹配算法--BF和KMP详解

    1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续   (如:abc 是abcdef的子串) ...

  7. KMP详解

    原文: http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 1. 引言 本KMP原文最初写于2年多前的2011年12月, ...

  8. mysql中binlog_format模式与配置详解

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复 ...

  9. PHP正则表达式模式修饰符详解

    PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...

随机推荐

  1. HTML5游戏开发框架phaser学习日志(一)下载phaser,在IIS中配置phaser的examples站点

    phaser是HTML5开源的游戏引擎. 一.源码下载地址:https://github.com/photonstorm/phaser 二.文档结构: 三.将phaser-master部署到IIS中站 ...

  2. 09.13随笔2014年9月13日22:32:38,奶爸的英语教室,groovy

    我们这里只推荐一本语法书:台湾的旋元佑老师写的<文法俱乐部>(简体版名为<语法俱乐部>).这本书因为出版社倒闭而绝版,淘宝可以买到影印的版本. (1)学英语到 奶爸的英语教室  ...

  3. Codevs 5056 潜水员

    5056 潜水员 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 潜水员为了潜水要使用特殊装备.他有一个带两种气体的气缸:一个为氮气 ...

  4. Linux下通过ODBC连接sqlserver

    Linux下通过ODBC连接sqlserver 1.需求: 最近有个需求就是要在linux下连接(可以执行sql语句)sqlserver 2.环境 操作系统:  Centos6.5 数据库:     ...

  5. SQLite学习第02天:数据类型

    参考资料:http://www.w3cschool.cc/sqlite/sqlite-data-types.html 在SQLite中,数据类型的概念看起来很模糊,刚开始接触感觉跟C语言提供的数据类型 ...

  6. absolute独立使用之下拉框最佳实践

              说明:传统的做法是给外部盒子relative定位,再给弹出框absolute定位,而这里我们将absolute独立使用 html <div class="searc ...

  7. CSS 常用命名

    在前端开发中,规范使用 DIV+CSS 命名,可以增强团队合作提高开发效率,有利于页面后期的维护和优化. 1.页面结构 wrap:外套.包裹,用于最外层. wrapper:外套,用于页面外围控制整体布 ...

  8. express cookie-session解惑

    express的中间件基于connect模块而来,所以相关文档可以直接参考 http://www.senchalabs.org/connect/ 使用cookie-session中间件过程中,比较困惑 ...

  9. linux命令之chown命令

    发布:JB01   来源:脚本学堂     [大 中 小] 本文介绍下,linux系统中用于文件与目录权限管理的命令 chown命令的用法,chown将指定文件的拥有者改为指定的用户或组.有需要的朋友 ...

  10. 全面理解.htaccess语法中RewriteCond和RewriteRule意义

    RewriteCond的语法 RewriteCond TestString CondPattern [Flags]其中的TestString是指一个文本格式的条件,例子中用的是环境变量名HTTP_HO ...