【原创】KMP算法代码(C)
//s是模式字符串,t是匹配字符串(可以看我上一篇文章中的叙述)
int KMP(const char * s , const char * t)
{
int slen = strlen(s) , tlen = strlen(t);
int i = , j = ;
int *next = ( int * )malloc( sizeof( int ) * slen );
GetNextVal( s , next); //生成部分匹配值的函数
while( i < slen && j < tlen )
{
if(s[i] == t[j])
{
i++;
j++;
}
else
if(i == )
{
j = j + ;//如果第一个字符都不匹配,就直接移一位
}
else
{
//按照上一篇文章中写的,移动步数 = 已匹配字符 - 匹配值
//算式应该是:j = ( j - i )+ ( i - next[i-1] ) ;(j - i )为首字符所在的位置
//化简后为:j = j - next[i-1]; 再将匹配字符串的索引归0; i = 0;
//但我们发现,对于之前已经匹配的字符我们又重新比较了一次,
//所以进行修正,j的值不变,移动匹配字符串,即 i = next[i-1]; i = next[i-];
}
}
free( next );
if( i == slen ) //说明匹配成功
return j - slen; //返回目标字符串中匹配字符串的位置
else
return -; //表示匹配失败
}
首先是KMP算法的主体,可能存在一定的代码冗余,但是是完全按照我上篇文章所写的内容写的,可能和网上的代码不太一样,但更好理解。下面插入生成部分匹配值的函数。
void * GetNextVal( const char *s , int *temp )
{
int i = , j = ;
4
temp[] = ; while( i < len)
{
i++;
if ( s[i] == s[j] )
{
j++;
temp[i] = j;
}
else
{
j = ;
if ( s[i] == s[j] )
{
j++;
temp[i] == j;
}
else
{
temp[i] == j;
}
}
}
}
这个函数代码冗余量有点多,需要改进,但目前没有想到修改方法。
【原创】KMP算法代码(C)的更多相关文章
- KMP算法代码
以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...
- Java KMP算法代码
1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...
- 【编程练习】kmp算法代码
代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...
- KMP算法以及优化(代码分析以及求解next数组和nextval数组)
KMP算法以及优化(代码分析以及求解next数组和nextval数组) 来了,数据结构及算法的内容来了,这才是我们的专攻,前面写的都是开胃小菜,本篇文章,侧重考研408方向,所以保证了你只要看懂了,题 ...
- 串的两种模式匹配方式(BF/KMP算法)
前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...
- kmp算法简明教程
在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a ...
- 查找子字符串----KMP算法深入剖析
假设主串:a b a b c a b c a c b a b 子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...
- 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
随机推荐
- MySQL5.7 JSON类型及其相关函数的学习
mysql> CREATE TABLE `json_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `info` json NOT NULL, PR ...
- TCP/IP学习
1.TCP/IP网络包括两部分 ①传输协议 ②网络协议
- ES6中的类和继承
class的写法及继承 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子 function Point(x, y) { this.x = x; this. ...
- sql取整数
[四舍五入取整]select round(1.1,0) 执行结果为1: [向下取整]select floor(1.1) 执行结果为2: [向上取整] select ceiling(1.1) 执行结果为 ...
- arch安装以及配置记录
设置ip和网关 ifconfig eth0 10.82.16.233 netmask 255.255.255.0 route add default gw 10.82.16.1 或者 ip addr ...
- MpVue 致力打造H5与小程序的代码共用
MpVue是什么 基于 Vue.js 的小程序开发框架 从底层支持 Vue.js 语法和构建工具体系. 使用vue开发小程序 修改了 Vue.js 的 runtime 和 compiler 实现,使其 ...
- linux下自动获取并安装软件包 apt-get 的命令介绍
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install p ...
- 基于SVD的图像压缩
算法简介 算法实现 我只是简单处理了一下图像的灰度值,如果要处理RGB值的话,就需要分别进行SVD分解,最后再合起来即可. import numpy as np from PIL import Ima ...
- Maven工程的POM继承
父POM的作用是消除配置的重复. 父POM必须<packaging>pom</packaging>. 还有 <modules> <module>子模块1 ...
- python内建数据类型有哪些
整型--int 布尔型--bool 字符串--str 列表--list 元组--tuple 字典--dict