数据结构万字总结(超级详细)第四章——字符串

串的定义

是由零个或多个字符组成的有限序列

存储

顺序存储

  • 静态数组

  • 动态数组

链式存储

可以每个结点存多个字符,没有字符的位置用‘\0‘补足 链式存储,存储密度很低

基本操作

比较

找子串

串和线性表的区别

可以从数据结构的三要素展开论述

区别

  • 串的数据对象限定为字符集

  • 串的基本操作大多以子串为操作对象

相同

  • 都是线性结构

字符串模式匹配

在主串中找到与模式串相同的子串,并返回其所在位置

朴素模式匹配算法

  • 思想:

    将主串中所有长度为m的子串依次与模式串对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止

  • 最多对比 n-m+1个子串(考试考过!!

  • 性能:O(m*n)

KMP算法

  • 思想

    根据模式串求出next数组,利用next数组进行匹配(主串指针不回溯)

  • 性能:O(m+n)

    其中,求next 数组时间复杂度O(m),模式匹配过程最坏时间复杂度O(n)

  • 重点掌握next数组的手算求法

    若出现当字符串不匹配时的位置为i,模式串向后移动,只要出现模式串的前缀和主串i前的字符串能匹配上,则模式串在i前包括i有几个字符串,下标就为几

求next数组例题:

next[1]和next[2]分别是0和1,

比如出现第6个字符不匹配时,模式串向后移动,直到部分能和主串匹配就停下来,如上图,因为?可能和b匹配,因此next[6]的值为 4.其他的值也可以自己手动算一下试试。

 求出next数组后,如果遇到第一个字符不匹配,则特别要注意next[1]这种情况:

 即要把模式串的指针定义为0,(此时的j的合法范围是从1开始,如果是从0开始,则j此时要定义为-1),然后i++,j++。即主串移动指针,子串也要移动指针

那么问题来了,比如考研复试某真题:KMP算法,什么情况下主指针需要向前移动?

答案:当第一个字符串不匹配的时候,即next[1]=0,此时需要移动主串的指针,只需移动一个单位,同时模式串的指针也要移动一个单位,以恢复到合法的指针范围。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值