贴上C代码作参考,关于算法,可以参考网上的博文,但不要参考太多,一两篇相近的即可。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* 获取pattern的next数组 */
void get_next(char * pattern, int * next, int len)
{
int i, index;
for (next[]=-, i=; i<len; i++)
{
if (pattern[i] == pattern[next[i-]+])
{
next[i] = next[i-] + ;
continue;
}
for (index=next[i-], next[i]=-; index!=-; index = next[index])
{
if (pattern[index+] == pattern[i])
{
next[i] = index + ;
break;
}
}
}
} int KMP(char * text, int tlen, char * pattern, int plen, int * ptr)
{
int i=, tindex=, pindex=, count=, * next = malloc(sizeof(int) * plen);
get_next(pattern, next, plen);
while (i < tlen)
{
if (pattern[pindex] == text[i])
{
i ++;
pindex ++;
if (pindex == plen)
{
pindex = ;
ptr[tindex++] = i-plen;
}
continue;
}
if (pindex == )
{
i ++;
}
else
{
pindex = next[pindex-] + ;
}
}
free(next);
return tindex;
} /* 按字符读入文件 */
int readText(const char * path, char * buf)
{
FILE * f;
int size;
f = fopen(path, "r");
if (!f)
{
return -;
}
fseek(f, , SEEK_END);
size = ftell(f);
rewind(f);
size = fread(buf, , size, f);
if (size <= )
{
size = -;
}
fclose(f);
return size;
} int main()
{
char text[] = {}, pattern[] = "aba";//"abcabdecabcabcd";
int * ptr, count = , plen, size = readText("file/text.txt", text), i=, j; if (size <= )
{
return -;
}
plen = strlen(pattern);
ptr = malloc((size/plen)*sizeof(int));
count = KMP(text, size, pattern, plen, ptr);
printf("%d results.\n", count);
while (i++ < count)
{
printf("index[%d] : ", i);
for (j=; j<plen; j++)
printf("%c",text[ptr[i-]+j]);
printf("\n======================\n");
}
free(ptr);
return ;
}

KMP算法C代码的更多相关文章

  1. KMP算法的代码实现

    上周算法班的BEN老师花了1个小时讲自动机和KMP的关系,结果failed...明天又要上课了,花了半天时间看了下KMP,暂且停留在利用next求模式中的跳跃长度,自动机那个还不能理解... 具体的可 ...

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

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

  3. KMP算法【代码】

    废话不多说,看毛片算法的核心在于next数组. 很多地方用的都是严书上的方法来求解next数组,代码确实简洁明了,但是可能对于初学者来说不容易想到,甚至不是一下子能理解.(好了,其实我说的就是自己,别 ...

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

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

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

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

  6. 字符串模式匹配KMP算法

    一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...

  7. KMP算法解析

    介绍一种高效的KMP算法:代码可以直接运行 #include <iostream> #include <iomanip> using namespace std; void p ...

  8. KMP算法具体解释

    这几天学习kmp算法,解决字符串的匹配问题.開始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配 ...

  9. 【字符串算法3】浅谈KMP算法

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...

随机推荐

  1. python面向对象初始进阶版 通过一道题带你认识面向对象

    定义一个类 class Person: #公共属性 animal='高级动物' soul='有灵魂' language='语言' def init(self,country,name,sex,age, ...

  2. Tomcat源码分析 (八)----- HTTP请求处理过程(一)

    终于进行到Connector的分析阶段了,这也是Tomcat里面最复杂的一块功能了.Connector中文名为连接器,既然是连接器,它肯定会连接某些东西,连接些什么呢? Connector用于接受请求 ...

  3. sql server 日期近一年,同比

    --近一年 ), , , ) SELECT CONVERT(VARCHAR, DATEADD(day, -DAY(GETDATE()), , ) --同比 ), , , ) SELECT CONVER ...

  4. 多线程之NSOperation

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD

  5. Day 07--最终修改(三)

    2.明天着重学一下逻辑层的语法,以及界面层的数据绑定,与队友交流进度 3.今天修改也终于完成,除了搞c++以外的全部身心都放在这个东西身上也觉得它有点难搞,说明计算机不是吃素的.甚至在使用xml语法的 ...

  6. java 路径问题

    java路径存在两种写法"/"和"\\" String path="D:\\1.txt"; String path1="D:/1. ...

  7. 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)

    </pre><pre name="code" class="cpp">/* Theme:八皇后(非递归) Coder:秒针的声音 Tim ...

  8. 关于原生js中函数的三种角色和jQuery源码解析

    原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...

  9. HDU 6315

    题意略. 思路:本题的思路总的来说就是暴力 + 剪枝. 我们依然用线段树来维护: 定义结点node{ l , r , minn , contirbute} 分别为某个区间的左右端点,和该区间(b序列) ...

  10. OpenCvSharp 通过特征点匹配图片

    现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思. 这个辅助本身没什么难度,就是通过不断的截图,然后从这个截图中找出预先截好的能代表相应 ...