串的定长顺序存储
#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算法的更多相关文章

  1. 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法

    一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...

  2. 字符串与模式匹配算法(三):KMP算法

    一.KMP算法介绍 KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯.回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj ...

  3. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  4. 查找子字符串----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 ...

  5. 数据结构与算法--KMP算法查找子字符串

    数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...

  6. 浅谈数据结构之KMP(串中的模式匹配算法)

    KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的 ...

  7. 字符串模式匹配算法1 - BF和KMP算法

    在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

  8. 字符串与模式匹配算法(四):BM算法

    一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...

  9. 字符串与模式匹配算法(五):BMH算法

    一.BMH算法介绍 在BM算法的实际应用中,坏字符偏移函数的应用次数要远远超过好后缀偏移函数的应用次数,坏字符偏移函数在匹配过程中起着移动指针的主导作用.在实际匹配过程,只是用坏字符偏移函数也非常有效 ...

  10. BF算法 + KMP算法

    准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结 ...

随机推荐

  1. mybatis-generator没有自动生成代码和Junit测试controller

    本来mybatis的generator想要自动生成增删改的,但是到后来语句就两个select,原因是数据中没有给字段加primary,就不会有删改增. 以及Controller的Junit测试 先导入 ...

  2. centos6.6安装hadoop-2.5.0(一、本地模式安装)

    操作系统:centos6.6(一台服务器) 环境:selinux disabled:iptables off:java 1.8.0_131 安装包:hadoop-2.5.0.tar.gz hadoop ...

  3. 2019-03-06-day012-生成器与推导式

    01 昨日回顾 迭代器: 迭代器有iter方法 next方法就是迭代器 递归: 自己调用自己 明确的结束条件 递归的最大深度 官方 1000 实际测试:998/997 import sys sys.s ...

  4. java学习笔记12(final ,static修饰符)

    final: 意思是最终的,是一个修饰符,有时候一个功能类被开发好了,不想被子类重写就用final定义, 用final修饰的最终数据成员:如果一个类的数据成员用final修饰符修饰,则这个数据成员就被 ...

  5. Oracle client安装教程

    一.下载 下载地址:http://download.csdn.net/detail/qq_35624642/9773986 这是Oracle Instant Client的CSDN下载地址. 要注意第 ...

  6. Django之静态文件配置

    在项目目录中打开settings.py,在最下面配置静态文件(css文件,js文件以及其他静态配置文件),比如说html使用到了jQuery框架,我们要在项目根目录下创建statics(可自定义),将 ...

  7. 【leetcode】283. Move Zeroes

    problem 283. Move Zeroes solution 先把非零元素移到数组前面,其余补零即可. class Solution { public: void moveZeroes(vect ...

  8. spring事务管理-Spring 源码系列(6)

    Spring事务抽象的是事务管理和事务策略.而实现则由各种资源方实现的.我们最常用的数据库实现:DataSourceTransactionManager 尝试阅读一下spring 的实现代码,由3个核 ...

  9. aliyun服务器对象存储oss

    aliyun OSS 使用简单.方便. 官方网址 aliyun.com 首先通过aliyun管理控制台申请OSS服务.通过AccessKeys分配Access Key ID和Access Key Se ...

  10. Unity 3D第三人称视角、用途广泛限定角度(视角不能360度翻转)

    Unity第三人称相机视角控制 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...