串、串的模式匹配算法(子串查找)BF算法、KMP算法
串的定长顺序存储
#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断
串的模式匹配:
串的定义:0个或多个字符组成的有限序列
S = 'a1a2a3…….an '
n = 0时为空串
串的顺序存储结构:字符数组,串的长度就是数组末尾‘\0'前面的字符个数
数组需在定义时确定长度,有局限性
数组的最大长度
二:串的堆分配存储表示
typedef struct {
char *ch;
//若是非空串,则按串长分配存储区
//否则ch为空
int length; //串长度
}HString;
系统利用函数mallloc和free进行串值空间的动态分配,由此产生的新串
其实是系统先为新生成的串分配一个存储空间,然后进行串的复制(这是C语言的串类型
的存储方式)
三、串的块链存储方式
#define CHUNKSIZE 80
typedef struct Chunk{ //结点结构
char ch[CHUNKSIZE];
struct Chunk* next;
}Chunk; typedef struct { //串的链表结构
Chunk*head, *tail; //串的头和尾指针
int curlen; //串的当前长度
}LString;
data | 指针
1byte 4byte
1/5存储密度
4.3串的模式匹配算法(子串查找)
BF算法:朴素算法
int Index(SString S, SString T, int pos)
{
i = pos; j = ;
while(i <= s[] && j <= T[])
{
if(s[i] == T[j])
{
++i;
++j;
}
else
{
i = i - j + ; //i指针回溯
j = ; //指针后退重新开始匹配
}
if(j > T[])
return i - T[];
else
return ;
}
}
int Index(SString S, SString T, int pos)
{
for(i = pos; i <= S[] - T[]; i++)
{
int k = i;
for(j = ; j <= T[]; j++)
{
if(S[i] == T[j])
{
i++;
j++;
}
else
{
i = k;
break;
}
}
if(j > T[])
return i - T[];
else
return ;
}
}
二、首尾匹配算法
先比较模式串的第一个字符
再比较模式串的最后一个字符
最后比较比较模式串中第二个得到倒数第二个之间的字符
算法复杂度和第一种一样O((n-m+1)m)
三、KMP算法
时间复杂度可达到O(m+n)
int Index(SString S, SString T, int pos)
{
i = pos; j = ;
while(i <= s[] && j <= T[])
{
//j == 0说明上次比较时第一个字符就不等next[1] = 0
if(j == || s[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j]; //i不用指针回溯
//j指针后退到next[j]重新开始匹配
}
}
if(j > T[])
return i - T[];
else
return ; }
求next函数值
已知:next[1] = 0;
假设:next[j] = k; 又因为T[k] = T[j]
则next[j+ 1] = k + 1;
ruo T[j] != T[k]
则需要回朔,检查T[j] = T[?]
这是几上也是一个匹配过程,不同在于:主串和模式串是同一个串
void get_next(SString &T, int &next[])//求模式串T的next函数值并存入数组next
{
i = ; next[] = ;
j = ;
while(i < T[])
{
if(j == || T[i] = T[j])
{
++i;
++j;
next[i] = j;
} else
j = next[j];
if(
} }
特殊情况
S = ‘aaabaaabaaabaaabaaab'
T = 'aaaab'
next[j] = 01234修正后00004
void get_next(SString &T, int &next[])//求模式串T的next函数值并存入数组next
{
i = ; next[] = ;
j = ;
while(i < T[])
{
if(j == || T[i] = T[j])
{
++i;
++j;
if(T[i] != T[j])
nextval [i] = j;
else
nextval[i] = next[j];
} else
j = nextval[j];
if(
} }
串、串的模式匹配算法(子串查找)BF算法、KMP算法的更多相关文章
- 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法
一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...
- 字符串与模式匹配算法(三):KMP算法
一.KMP算法介绍 KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯.回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 查找子字符串----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算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- 浅谈数据结构之KMP(串中的模式匹配算法)
KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...
- 字符串与模式匹配算法(五):BMH算法
一.BMH算法介绍 在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用.在实际匹配过程,只是用坏字符偏移函数也非常有效 ...
- BF算法 + KMP算法
准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结 ...
随机推荐
- 五、LCD屏填充纯色
废话不说,直接上代码: lcd.c #include "lcd.h" static int PEN_COLOR = LCD_RED; /* 定义画笔(前景)颜色 */ static ...
- Vue数组操作不刷新视图问题的解决
最近使用Vue2.0开发项目,有一个列表使用v-for绑定到数组,按照Vue的推荐方案,使用push.splice.this.$set三个变异方法操作数组.发现在添加页面,三个方法都能及时刷新视图:但 ...
- VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”
VS2017升级之后,代码调试无法进入,显示“当前无法命中断点,还没有为该文档加载任何符号”的问题解决思路: 1.工具-选项-项目和解决方案-生成并运行,取消勾选“在运行时仅生成启动项目和依赖性” 2 ...
- php 怎样将有范围的ip转化为整型范围
php中将IP转换成整型的函数ip2long()容易出现问题,在IP比较大的情况下,会变成负数.如下: <?php $ip = "192.168.1.2"; $ip_n = ...
- sqlplus/rman登录报权限错误ORA-01031/ORA-04005/0RA-00554
安装Weblogic误操作对Oracle用户属组进行了修改 --本地sqlplus登录报错权限问题??? [oracle@enmo admin]$ sqlplus / as sysdba SQL*Pl ...
- Python之路,第十一篇:Python入门与基础11
python3 函数2 全局变量:一直存在 局部变量:函数执行时存在,执行完毕后销毁: lambda 表达式(又称匿名函数表达式) 作用: 创建一个匿名(无名)函数对象, 同 def 类似但不提供函 ...
- mysql设置外键约束开启-关闭
在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint f ...
- 苹果手机不兼容autoplay属性
var audio=new Audio("music/music.mp3"); audio.preload="preload"; // 自动播放解决苹果不兼容a ...
- php 函数集锦
1.array_intersect_assoc()用于比较两个(或更多个)数组的键名和键值,并返回交集. <?php $a1=array("a"=>"red& ...
- 05 面向对象:构造方法&static&继承&方法 &final
构造方法及其重载: /* 构造方法格式特点 * a:方法名与类名相同(大小也要与类名一致) * b:没有返回值类型,连void都没有 * c:没有具体的返回值return; * 构造方法的重载 * 重 ...