本文参考阮一峰老师的KMP算法,重点是“部分匹配表”的建立。算法可参考 http://kb.cnblogs.com/page/176818/ 。

/*
* kmp.cpp
* Author: Qiang Xiao
* Time: 2015-07-18
*/ #include<iostream>
#include<string>
using namespace std; int kmp(string& ma, string& sub, int a[]);
int max_fix_len(string& a, int len); int main(){
string ma= "ABCCBB";
string sub= "CCB";
int dis[sub.length()];
dis[]= -;
for(int i= ; i< sub.length(); i++){
dis[i]= max_fix_len(sub, i+);
}
int km= kmp(ma, sub, dis);
cout<<ma<<endl<<sub<<endl;
cout<<km<<endl;
return ;
} int max_fix_len(string& a, int len){
int ll= ; //ll denotes the length of prefix, perspectively.
int maxLen= ;
while(ll< len){
int j;
for(j= ; j< ll; j++){
if(a.at(j)!= a.at(len+j-ll))
break;
}
if(j== ll- )
maxLen= ll- ;
ll++;
}
return maxLen;
} int kmp(string& ma, string& sub, int dis[]){
int lens= sub.length();
int lenm= ma.length();
int wai= ;
while(wai< lenm- lens){
int nei1= ; //sub
int nei2= wai; //ma
for(nei1= ; nei1< lens; nei1++){
if(ma.at(nei2)== sub.at(nei1)){
nei1++;
nei2++;
}
else{
nei1++;
break;
}
}
if(nei1== lens){
return wai+ ;
}
wai= wai+ nei1- dis[nei1- ]- ;
}
return -;
}

运行结果为:

xiaoq@xq-ubun:~/C/DataStructure$ g++ kmp.cpp -o kmp.o
xiaoq@xq-ubun:~/C/DataStructure$ ./kmp.o
ABCCBB
CCB xiaoq@xq-ubun:~/C/DataStructure$

如果错误,请指正。

欢迎交流!

KMP算法的一个C++实现的更多相关文章

  1. KMP算法与一个经典概率问题

    考虑一个事件,它有两种概率均等的结果.比如掷硬币,出现正面和反面的机会是相等的.现在我们希望知道,如果我不断抛掷硬币,需要多长时间才能得到一个特定的序列. 序列一:反面.正面.反面序列二:反面.正面. ...

  2. KMP算法的一个简单实现

    今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...

  3. HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)

    题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...

  4. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  5. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

  6. KMP算法解析(转自图灵社区)

    KMP算法是一个很精妙的字符串算法,个人认为这个算法十分符合编程美学:十分简洁,而又极难理解.笔者算法学的很烂,所以接触到这个算法的时候也是一头雾水,去网上看各种帖子,发现写着各种KMP算法详解的转载 ...

  7. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  8. [知识点]KMP算法

    // 此博文为迁移而来,写于2015年5月24日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1iw.html 1.前 ...

  9. KMP算法(转载)

    转载http://blog.csdn.net/yutianzuijin/article/details/11954939 kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以 ...

随机推荐

  1. grunt api 文档

    Grunt docs Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. 安装 grunt-cli npm install grunt-cli -g 注 ...

  2. perl 爬取上市公司业绩预告

    <pre name="code" class="python">use LWP::UserAgent; use utf8; use DBI; use ...

  3. Azure 网站和通配符域

     本文章由Azure 网站团队软件开发工程师Michael Candido 撰写 一些 Web 应用程序需要使用多个子域,在某些情况下还需要动态添加新的子域.例如,一个多租户 Web 应用程序可使 ...

  4. Codeforces 123E Maze(树形DP+期望)

    [题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...

  5. (Android) ContentProvider 实例

    ContentProvider 用于应用程序(Android Application)之间传递数据,包括Insert, update, delete, query. 下面的例子是在两个应用之间传递数据 ...

  6. nyist 202 红黑树(二叉树中序遍历)

    旋转对中序遍历没有影响,直接中序输出即可. #include <iostream> #include <cstdio> using namespace std; int n; ...

  7. g711u与g729比較编码格式

    •711a-编解码格式为G.711 alaw •g711u-编解码格式为G.711 ulaw (the default) •g729-编解码格式为G.729 •g729a-编解码格式为G.729a 上 ...

  8. C# 动态载入Dll

    1.新建測试dll及方法,用vs2010新建winform程序,详细代码例如以下: using System; using System.Collections.Generic; using Syst ...

  9. 2014年辛星Javascript解读第二节

    本小节我们解说一下Javascript的语法,尽管js语言很easy,它的语法也相对好学一些,可是不学总之还是不会的,因此,我们来一探到底把. ********凝视************* 1.我们 ...

  10. android解决内存溢出的问题(没有从根本上解决)

    Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完 ...