串的定长顺序存储
#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断

串的模式匹配:

串的定义:0个或多个字符组成的有限序列
S = 'a1a2a3…….an '
n = 0时为空串
串的顺序存储结构:字符数组,串的长度就是数组末尾‘\0'前面的字符个数
数组需在定义时确定长度,有局限性
数组的最大长度
二:串的堆分配存储表示
typedef struct {
char *ch;
//若是非空串,则按串长分配存储区
//否则ch为空
int length; //串长度
}HString;
系统利用函数mallloc和free进行串值空间的动态分配,由此产生的新串
其实是系统先为新生成的串分配一个存储空间,然后进行串的复制(这是C语言的串类型
的存储方式)

三、串的块链存储方式

  1. #define CHUNKSIZE 80
  2. typedef struct Chunk{ //结点结构
  3. char ch[CHUNKSIZE];
  4. struct Chunk* next;
  5. }Chunk;
  6.  
  7. typedef struct { //串的链表结构
  8. Chunk*head, *tail; //串的头和尾指针
  9. int curlen; //串的当前长度
  10. }LString;

data | 指针
1byte 4byte
1/5存储密度

4.3串的模式匹配算法(子串查找)
BF算法:朴素算法

  1. int Index(SString S, SString T, int pos)
  2. {
  3. i = pos; j = ;
  4. while(i <= s[] && j <= T[])
  5. {
  6. if(s[i] == T[j])
  7. {
  8. ++i;
  9. ++j;
  10. }
  11. else
  12. {
  13. i = i - j + ; //i指针回溯
  14. j = ; //指针后退重新开始匹配
  15. }
  16. if(j > T[])
  17. return i - T[];
  18. else
  19. return ;
  20. }
  21. }
  1. int Index(SString S, SString T, int pos)
  2. {
  3. for(i = pos; i <= S[] - T[]; i++)
  4. {
  5. int k = i;
  6. for(j = ; j <= T[]; j++)
  7. {
  8. ifS[i] == T[j])
  9. {
  10. i++;
  11. j++;
  12. }
  13. else
  14. {
  15. i = k;
  16. break;
  17. }
  18. }
  19. if(j > T[])
  20. return i - T[];
  21. else
  22. return ;
  23. }
  24. }

二、首尾匹配算法
先比较模式串的第一个字符
再比较模式串的最后一个字符
最后比较比较模式串中第二个得到倒数第二个之间的字符
算法复杂度和第一种一样O((n-m+1)m)

三、KMP算法
时间复杂度可达到O(m+n)

  1. int Index(SString S, SString T, int pos)
  2. {
  3. i = pos; j = ;
  4. while(i <= s[] && j <= T[])
  5. {
  6. //j == 0说明上次比较时第一个字符就不等next[1] = 0
  7. if(j == || s[i] == T[j])
  8. {
  9. ++i;
  10. ++j;
  11. }
  12. else
  13. {
  14. j = next[j]; //i不用指针回溯
  15. //j指针后退到next[j]重新开始匹配
  16. }
  17. }
  18. if(j > T[])
  19. return i - T[];
  20. else
  21. return ;
  22.  
  23. }

求next函数值
已知:next[1] = 0;
假设:next[j] = k; 又因为T[k] = T[j]
则next[j+ 1] = k + 1;
ruo T[j] != T[k]
则需要回朔,检查T[j] = T[?]
这是几上也是一个匹配过程,不同在于:主串和模式串是同一个串

  1. void get_next(SString &T, int &next[])//求模式串T的next函数值并存入数组next
  2. {
  3. i = ; next[] = ;
  4. j = ;
  5. while(i < T[])
  6. {
  7. if(j == || T[i] = T[j])
  8. {
  9. ++i;
  10. ++j;
  11. next[i] = j;
  12. }
  13.  
  14. else
  15. j = next[j];
  16. if(
  17. }
  18.  
  19. }

特殊情况
S = ‘aaabaaabaaabaaabaaab'
T = 'aaaab'
next[j] = 01234修正后00004

  1. void get_next(SString &T, int &next[])//求模式串T的next函数值并存入数组next
  2. {
  3. i = ; next[] = ;
  4. j = ;
  5. while(i < T[])
  6. {
  7. if(j == || T[i] = T[j])
  8. {
  9. ++i;
  10. ++j;
  11. if(T[i] != T[j])
  12. nextval [i] = j;
  13. else
  14. nextval[i] = next[j];
  15. }
  16.  
  17. else
  18. j = nextval[j];
  19. if(
  20. }
  21.  
  22. }

串、串的模式匹配算法(子串查找)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. Html.DropDownList()的用法

    页面代码如下: <%= Html.DropDownList("Category", ViewData["Categories"] as SelectLis ...

  2. requery.js使用姿势

    最近在看requerjs,现在来总结下自己的收获,有不对的地方,望大家指正! 1.首先介绍下requirejs,引用中文官网http://www.requirejs.cn的一句话,requirejs是 ...

  3. apache 服务器配置

    第一.强制www域名301跳转 RewriteEngine onRewriteCond %{HTTP_HOST} ^itbulu\.com [NC]RewriteRule ^(.*)$ https:/ ...

  4. JAVA修饰符、关键字和继承(一)

    一.静态修饰符----static static可以修饰内部类.块.属性.方法,经static修饰过的元素储存地址唯一,不会改变 public class Test{ static int a=1; ...

  5. 对ajax中数据的得到以及绑定的认识

    1.将后台得到的数据绑定到datagrid为例: 第一种是: 后台得到的数据直接绑定到datagrid上面,如下图: 这样操作的好处在于可以使界面比较简洁. 第二种是将得到的数据作为参数的形式绑定到d ...

  6. Python学习笔记第十一周

    目录: 1.RabbitMQ   2.Redis  内容: 1.RabbitMQ 实现简单的队列通信 send端 import pika credentials = pika.PlainCredent ...

  7. PHP中PSR-[0-4]规范(转)

    PHP中PSR-[0-4]规范 更好排版:https://www.zybuluo.com/phper/note/65033 PHP是世界上最伟大的语言,这一点是毋庸置疑的吧.哈哈哈哈哈哈 .这个霸气的 ...

  8. The repository 'http://cdn.debian.net/debian stretch Release' is not signed.

    /********************************************************************************* * The repository ...

  9. 12.double的int方

    给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 不要用Math.pow(double,double)哟.效率极其低下,比连成慢好多: 题 ...

  10. java错误:找不到或无法加载主类

    问题: 在 windows cmd 中编译后,运行 java 文件时,出现此错误 分析: 源文件 ClientDemo.java: package netdemo; public class Clie ...