二维数组m的元素是4个字符组成的串_数据结构串和数组(一)

一、串的基本概念

串是由零个或多个字符组成的有限序列。记作str="a0a1…an-1"(n≥0)。

串中所包含的字符个数n称为串长度,当n=0时,称为空串。

一个串中任意连续的字符组成的子序列称为该串的子串。

包含子串的串相应地称为主串。

若两个串的长度相等且对应字符都相等,则称两个串相等。

s是一个长度为n的串,其中的字符各不相同,则s中的所有子串个数是多少?

1b80b77a647bde49e2e9e7ccb2ce1b9b.png

二、串的抽象数据类型

e97a8060a381374deb4bc169784f3484.png

三、串的存储结构

c62064fe784910bd22dd0fed0195bb2c.png

串的顺序存储结构—顺序

和顺序表一样,用一个data数组和一个整型变量size来表示一个顺序串,size表示data数组中实际字符的个数。

为了简单,data数组采用固定容量为MaxSize(可以模仿顺序表改为动态容量方式)。

顺序串类SqString

5fd362a1e129256cd98a687efc371eac.png

顺序串上的基本运算算法设计与顺序表类似,仅以求子串为例说明。

求子串:对于一个顺序串求序号i开始长度为j的子串。

e32f896eecde251896b1daac8e3e8a3e.png

实现:先创建一个空串s,当参数正确时,s子串的字符序列为data[i..i+j-1],共j个字符,当ii+j-1不在有效序序号0~size-1范围内时,则参数错误,此时返回空串。

7b03d773801c15e554916a74697542a8.png

设计一个算法Strcmp(st),以字典顺序比较两个英文字母串st的大小,假设两个串均以顺序串存储。

625c4d030e457e10422efd34f9fe56ea.png

串的链式存储结构—链串

4bdccab8d4812cefe0fbfc263a5fc2e1.png

用带头结点的单链表表示链串

例如,s= "ABCDEFGHIJKLMN",共14个字符。

62a0817dfafa745ec8b93fd7ede3a5de.png

链串的结点类型LinkNode(结点大小为1)

0f02a17de9fa11a86cfd8d0e6a370bf2.png

一个链串用一个头结点head来唯一标识,链串类LinkString

c4bf0753776e3741fee2ce00c0551096.png

链串上的基本运算算法设计与单链表类似,仅以串插入算法为例说明。

串插入:链串在序号i位置插入串t

82ae0d9f42c9f60762b72347589db9d9.png

实现:先创建一个空串s,当参数正确时,采用尾插法建立结果串s:

(1)将当前链串的前i个结点复制到s中。

(2)将t中所有结点复制到s中。

(3)再将当前串的余下结点复制到s中。

cd494a80107a705c6e15bf7160c2d440.png
07799f12615051b067a590be3a3c69aa.png

串的模式匹配

设有两个串s和t,串t定位操作就是在串s中查找与子串t相等的子串。

通常把串s称为目标串,把串t称为模式串,因此定位也称作模式匹配。

模式匹配成功是指在目标串s中找到一个模式串t。

不成功则指目标串s中不存在模式串t。

BF算法

思路:目标串s="s0s1…sn-1",模式串t="t0t1…tm-1"

第1趟:从s0/t0开始比较,若相等,则继续逐个比较后续字符。如果对应的字符全部相同且t的字符比较完,说明t是s的子串,返回t在s中的起始位置,表示匹配成功;如果对应的字符不相同,说明第一趟匹配失败。

第2趟:从s1/t0开始比较,若相等,则继续逐个比较后续字符。如果对应的字符全部相同且t的字符比较完,说明t是s的子串,返回t在s中的起始位置,表示匹配成功;如果对应的字符不相同,说明第一趟匹配失败。

依次类推。只要有一趟匹配成功,则说明t是s的子串,返回t在s中的起始位置。如果i超界都没有匹配成功,说明t不是s的子串,返回-1。

017e5a66c0507d891c56393d71512dcd.png

BF算法性能

该算法在最好情况下的时间复杂度为O(m),即主串的前m个字符正好等于模式串的m个字符。

最坏情况下的时间复杂度为O(n×m)。

平均情况下的时间复杂度为O(n×m)。

cbd575332db33dd1412f45347667a75f.png

KMP算法

主要是消除了目标串指针的回溯,从而使算法效率有了某种程度的提高。

926f8d2104144e126f2e455364d1cfb5.png
18b28605cd4a7760ecc4d7581932addc.png
97294134dced4c5ca18d2e36f76ac1de.png
3096b008cea2f8f6d89572c29b69873f.png
d0444894b7c13a435e2eac1fa77610c2.png
326f88709e7ac5962eea097c90a6c2ec.png
e970f5b5886b47ac414eeadf2332e84a.png

KMP算法性能

设目标串s的长度为n,模式串t长度为m。

在KMP算法中求next数组的时间复杂度为O(m)。

在后面的匹配中因主串s的下标i不减即不回溯,比较次数可记为n。

KMP算法的时间复杂度为O(n+m)。

例子:设目标串s="ababcabcacbab",模式串t="abcac"。给出KMP进行模式匹配的过程。

fdeba7d1be4148f4d58802cefc80c542.png
cad563064b0c791372e7b99213c24bfc.png

KMP算法的性能提高了吗?

KMP算法跳过了中间一些趟,正确吗?

0fe9b2d225bb8b33ba967cae0ce574c7.png
b90b885abd67d105f2cdc832aa16ceca.png
44d65addae5ee2a531f9643781a5d632.png
d534753919fa0273feff7e9f06fa6c80.png
62c92d2ded9322b16ef4dd02b2a5e623.png
d7ff6611c81758b6e18ea6ec0a7b6f30.png
e7fefc21357310752f92db9c6baca151.png
51f1760009ca3e6b4211523b8a84930e.png
3cf79b02d51a1aed42103bbb05f5077b.png
cc2a47a1588998bbff22b036bb79b66c.png
999c7645760aa061e9feda2616b56069.png

例子:设s="aaabaaaab",t="aaaab"。计算模式串t的nextval函数值。并画出利用改进KMP算法进行模式匹配时每一趟的匹配过程。

472fea2ce18718ba2a246d8582a7dbca.png
4e67b2ff6825af443f459dcedb5fd93b.png

例子:设目标串为s="abcaabbabcabaacbacba",模式串t="abcabaa"。计算模式串t的nextval函数值。并画出利用KMP算法进行模式匹配时每一趟的匹配过程。

d157a1368b33f53a1ead78b99bab125f.png
a00073f54de8fe4154a8f47357d950b1.png
960dc079c925caf9eca37414bc72b002.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值