KMP算法C代码
贴上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代码的更多相关文章
- KMP算法的代码实现
上周算法班的BEN老师花了1个小时讲自动机和KMP的关系,结果failed...明天又要上课了,花了半天时间看了下KMP,暂且停留在利用next求模式中的跳跃长度,自动机那个还不能理解... 具体的可 ...
- 字符串匹配(KMP 算法 含代码)
主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...
- KMP算法【代码】
废话不多说,看毛片算法的核心在于next数组. 很多地方用的都是严书上的方法来求解next数组,代码确实简洁明了,但是可能对于初学者来说不容易想到,甚至不是一下子能理解.(好了,其实我说的就是自己,别 ...
- KMP算法具体解释(转)
作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...
- 字符串模式匹配KMP算法
一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...
- KMP算法解析
介绍一种高效的KMP算法:代码可以直接运行 #include <iostream> #include <iomanip> using namespace std; void p ...
- KMP算法具体解释
这几天学习kmp算法,解决字符串的匹配问题.開始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配 ...
- 【字符串算法3】浅谈KMP算法
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...
随机推荐
- 『深度应用』NLP命名实体识别(NER)开源实战教程
近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务—命名实体识别(Named Entity Recogni ...
- C#串口类封装 SuperSerialPort
C#串口类封装 SuperSerialPort 基于SerialPort类做了简单的封装方便调用 代码 /// <summary> /// SuperSerialPort /// < ...
- python-day16
一.正则表达式 regular expression -----regex 验证匹配正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替 ...
- 小白学Python(7)——利用Requests下载网页图片、视频
安装 Requests 如果安装了Requests就已经可用了,否则要安装 Requests,只要在你的CMD中运行这个简单命令即可: pip install requests requests使用 ...
- mongo常用语法
首先要能进入控制台,进不去自己解决. 基本操作: show users:显示用户 show dbs:显示数据库列表 use <db name> 切换/创建数据库 show collecti ...
- poium测试库之JavaScript API封装原理
poium一直我在维护的一个开源项目,它的定位是以极简的方式在自动化项目中Page Objects设计模式.我在之前的文章中也有介绍. 本篇文章主要介绍一个JavaScript元素操作的封装原理. 为 ...
- Linux系统下LNMP架构搭建
一.防火墙状态: 1.查看防火墙状态: systemctl status firewalld service iptables status firewall-cmd --state 2.永久有效开启 ...
- [Mysql] GroupBy 分组,按天、周、月
简单说明: 最近在做报表功能的时候,需要将数据按天.周和月进行合并展示(数据记录都是按天20190701). 正文: 说明:数据表中date都是int类型:如 20190701 一.按天 SELECT ...
- APPARENT DEADLOCK!!!c3p0数据库连接池死锁问题
项目进行压力测试的时候,运行大概1小时候,后台抛出以下异常: Nov 9, 2012 1:41:59 AM com.mchange.v2.async.ThreadPoolAsynchronousRun ...
- spss分析存在共性线后,接下来是怎么分析?
在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关,这种情况被称作多重共线性问题. 适度的多重共线性不成问题,但当出现严重共线性问题时,可能导致分析结果不稳定,出现回归系数的符号与实际情况完 ...