字符匹配模式-KMP算法

j直接跳到了2的位置,因为在之前的都相同。

那么就需要求如果不等了之后,j需要回跳的位置next[j]

            

     

            

                

如果tk'与tj相等,则next [j+1]=k'+1

如果tk‘与tj不相等,则继续向前找,直到找到next[0]=-1为止

注意:t是从0下标开始

 1 void getnext(string t)
2
3 {
4
5 int j=0,k=-1;
6
7 int len=t.size();
8
9 next[0]=-1;
10
11 wihle(j<len)
12
13 {
14
15 if(k==-1||t[j]==t[k])
16
17 next[++j]==++k;
18
19 else
20
21 k=next[k];
22
23 }
24
25 }

得到next数组之后就可以进行枚举了,当s[i]!=t[j]时,就让j=next[j]然后再次进行讨论。

KMP匹配:

 1 int KMP(steing s,string t,int pos)
2
3 {
4
5 int i=pos,j=0
6
7 int lens=s.size();
8
9 int lent=t.size();
10
11 getnext(t);
12
13 while(i<lens&&j<lent)
14
15 {
16
17 if(j==-1||s[i]==t[j])
18
19 i++,j++;
20
21 else
22
23 j=next[j];
24
25 }
26
27 if(j>=lent)//匹配成功,则返回i-lent+1(即为t串出现的位置)
28
29 return i-lent+1;
30
31 else
32
33 return -1;
34
35 }

另外:

算法优化

当s[i]!=t[j]时,j=next[j]=k,如果t[j]=t[k],就没必要来比较,直接退回到next[k].

代码如下:

 1 void getnext(string t)
2 {
3 int j=0,k=-1;
4 int len=t.size();
5 next[0]=-1;
6 wihle(j<len)
7 {
8 if(k==-1||t[j]==t[k])
9 {
10 j++,k++;
11 if(t[j]==t[k])
12 next[j]=next[k];//下一次要跳时就会直接从j跳到next[k];
13 else
14 next[j]=k;
15 }
16 else
17 k=next[k];
18 }
19 }

KMP算法-字符匹配的更多相关文章

  1. KMP算法——字符匹配

     暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...

  2. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

  3. KMP算法 字符串匹配(看猫片)

    前言 此篇笔记根据自己的理解和练习心得来解释算法,只代表个人观点,如有不足请指出(我刚学QWQ) 浅谈字符串匹配 设想一个场景,假设你是一个净化网络语言环境的管理员,每天需要翻阅大量的文章和帖子来查找 ...

  4. KMP算法——字符串匹配

    正直找工作面试巅峰时期,有幸在学校可以听到July的讲座,在时长将近三个小时的演讲中,发现对于找工作来说,算法数据结构可以算是程序员道路的一个考量吧,毕竟中国学计算机的人太多了,只能使用这些方法来淘汰 ...

  5. KMP算法---字符串匹配

    算法细节详见点击打开链接和点击打开链接 #include <stdio.h> #include <stdlib.h> #define N 7 #define M 15 void ...

  6. HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串

    题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...

  7. 字符串匹配(KMP 算法 含代码)

    主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...

  8. KMP算法-Java实现

    目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...

  9. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

随机推荐

  1. 手机端wap站网页播放腾讯视频代码

    <div class="detail-con clear"> <div id="mod_player_wrap" class="mo ...

  2. sql查询字段语句

     SELECT * from jd_content where 景点简介 like '%东城%' 

  3. 牛客挑战赛48C-铬合金之声【Prufer序列】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/C 题目大意 \(n\)个点加\(m\)条边使得不存在环,每种方案的权值是所有联通块的大小乘积. 求 ...

  4. .NET 5 WPF 调用OCX 经验分享

    在.Net 5.0 WPF中调用OCX步骤如下: 1,用工具先把ocx转换成AxInterop.EloamViewLib.dll和Interop.EloamViewLib.dll.(这里是我用到的oc ...

  5. dg create datafile auto failed 排除处理

    1.Environment:11.2.0.4 dg 2.Symptoms:告警描述:Wed Sep 22 14:29:15 2021Errors in file /data/app/oracle/di ...

  6. 查询windows日志

    系统日志可以用来查看系统的一些信息,比如警告.错误.验证.开关机等. 打开系统日志 按下快捷键win+R,输入eventvwr.exe,并点击确定 查询开关机记录 点击左侧Windows日志-> ...

  7. Java(14)面向对象之封装

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201610.html 博客主页:https://www.cnblogs.com/testero ...

  8. Markdown Reference

    Markdown For Typora Overview Markdown is created by Daring Fireball; the original guideline is here. ...

  9. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

  10. sql常用的统计公式

    hivesql中max,min函数不能作用于多列,因此在有上下门限区间限制时多用公式直接计算. max(x,y)=(x+y+ABS(x-y))/2 min(x,y)=(x+y-ABS(x-y))/2 ...