处理字符串的过程中,难免会遇到字符匹配的问题。常用的字符匹配方法

1. 朴素模式匹配算法(Brute-Force算法)

求子串位置的定位函数Index( S, T, pos).

  模式匹配:子串的定位操作通常称作串的模式匹配。
  目标串:主串S。
  模式串:子串T。
  匹配成功:若存在T的每个字符依次和S中的一个连续字符序列相等,则称匹配成功。返回T中第一个字符在S中的位置。
  匹配不成功:返回0。
 
  lBrute-Force简称为BF算法,亦称简单匹配算法,其基本思路是:

从目标串s=“s1s2…sn"的第一个字符开始和模式串t=“t1t2…tm"中的第一个字符比较,若相等,则继续逐个比较后续字符;

  否则从目标串s的第二个字符开始重新与模式串t的第一个字符进行比较。

  依次类推,若从模式串s的第i个字符开始,每个字符依次和目标串t中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,函数返回0。

2. 模式匹配的改进算法-KMP算法

KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的,简称KMP算法。该算法较BF算法有较大改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。

  

  每趟匹配过程中出现字符比较不等时,不回溯主指针i,利用已得到的“部分匹配”结果将模式向右滑动尽可能远的一段距离,继续进行比较。

  定义next[j]函数,表明当模式中第j个字符与主串中相应字符“失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。(具体描述参见数据结构(严蔚敏版))

 

  next函数的定义:

  

下面给出实现:

  其中获取next数组的函数,和课本描述稍微有点差异。原文使用字符串第一个值表示字符串的大小,真正的字符串内容从第二个字符开始,和平时使用不一致,本文将其改变。并对next数组的值的意义进行改变,认为next值为-1时,匹配失效,需要改变主串的比较的数组(i+1),即相对于课本,把所有next值减一,而意义不变。

 #include <cstdio>
#include <string>
using namespace std; void get_next(string p, int* next)
{
int sp = p.size();
next[]=-; int i,j;
i=;j=-; while(i<sp-)
{
if(j==-||p[i]==p[j])
{
++i;++j;
if(p[i]!=p[j])
next[i]=j;
else
next[i]= next[j];
}
else
{
j=next[j];
}
}
}
void printNext(int* next,int n)
{
for(int i =; i<n;i++)
printf("%d ",next[i]);
printf("\n");
}
int kmp_search(string s, string pattern,int pos)
{
int sizeP = pattern.size();
int sizeS = s.size(); int *next = new int[sizeP];
memset(next,,sizeof(int)*sizeP); get_next(pattern,next);
printNext(next,sizeP); int i,j;
i=;j=; while(i<sizeS&&j<sizeP)
{
if(j==-||s[i]==pattern[j])
{
++i;++j;
}
else
{
j=next[j];
}
} delete next; if(j==sizeP)
{
return i-sizeP;
}
else
return -; }
int main()
{
string s = "abacaesabacadfabacawersdf";
string pat = "abacaw";
int result = kmp_search(s,pat,);
printf("s: %s\tt: %s\npos: %d\n",s.c_str(),pat.c_str(),result);
return ;
}

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

  1. 字符串匹配算法——KMP算法学习

    KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...

  2. 字符串匹配算法KMP算法

    数据结构中讲到关于字符串匹配算法时,提到朴素匹配算法,和KMP匹配算法. 朴素匹配算法就是简单的一个一个匹配字符,如果遇到不匹配字符那么就在源字符串中迭代下一个位置一个一个的匹配,这样计算起来会有很多 ...

  3. [Algorithm] 字符串匹配算法——KMP算法

    1 字符串匹配 字符串匹配是计算机的基本任务之一. 字符串匹配是什么?举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串& ...

  4. 字符串匹配算法-kmp算法

    一原理: 部分转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字 ...

  5. 算法数据结构 | 只要30行代码,实现快速匹配字符串的KMP算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法数据结构专题的第29篇文章,我们来聊一个新的字符串匹配算法--KMP. KMP这个名字不是视频播放器,更不是看毛片,它其实是由Kn ...

  6. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

  7. 字符串匹配算法 -- Rabin-Karp 算法

    字符串匹配算法 -- Rabin-Karp 算法 参考资料 1 算法导论 2 lalor 3 记忆碎片 Rabin-karp 算法简介 在实际应用中,Rabin-Karp 算法对字符串匹配问题能较好的 ...

  8. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  9. Java数据结构之字符串模式匹配算法---KMP算法

    本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...

随机推荐

  1. jsf primefaces note

    对应cdi,inject的变量,必须使用getter才能访问的值. @Inject DateView dateView; dateView.getFromDate1() 这样是娶不到的: dateVi ...

  2. jboss wildfly 外网访问

    在standalone.xml中: 找到下面三行,看到是要访问public(8080端口的)和management的interface,将interface中的127.0.0.1改为0.0.0.0即可 ...

  3. Mysql学习笔记(一)

    技术的王国太过迷人,我刚从事IT就被各种技术所引诱迷惑,什么都想学.我还算言而有信的那一类人,还好有一丁点毅力,于是各种东西都沾染了一点.但是这种遍地开花的情况实在和我的智商不匹配.我没有那么多的精力 ...

  4. JAVA内存机制

    Java程序运行时,数据会分区存放,JavaStack(Java栈). heap(堆).method(方法区). 一.JVM内存模型 1.Java栈Java栈的区域很小,只有1M,特点是存取速度很快, ...

  5. DNS介绍

    DNS出现及演化 网络出现的早期 是使用IP地址通讯的,那时就几台主机通讯.但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和w ...

  6. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  7. 使用Java中的动态代理实现数据库连接池

    2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...

  8. JS定时器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. htons

    在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例: 1 2 #include<winsock2.h> u_shortht ...

  10. rem是如何实现自适应布局的?

    http://caibaojian.com/web-app-rem.html 使用rem 然后根据媒体查询实现自适应.跟使用JS来自适应适配也是同个道理,不过是js更精确一点.使用媒体查询: html ...