005字符串(完)

本文介绍了字符串的基本概念,包括顺序存储和链式存储结构,并详细讲解了朴素模式匹配算法和KMP算法,阐述了KMP算法如何避免重复比较,提高效率。最后提到了改进的KMP算法,探讨了如何优化匹配过程。

概述

  1. 字符串: 由零个或多个字符组成的有限序列。
  2. 记法: s = "a1, a2, ...,an";
  3. 空字符: Φ \Phi Φ = ""
  4. 空格串: 只包含空格的字符串
  5. 子串: 串中任意个数的连续字符组成的子序
  1. 字符串相邻字符之间具有前驱和后继的关系。
  2. 子串在主串中的位置是子串的第一个字符在主串序列的序号
  • 串的比较
  1. 通过比较串的字符之间的编码来进行的,而字符的编码值为字符在对应字符集中的序号
  2. ASCII 8位二进制表示一个字符,用于表示英文、数字、特殊字符等
  3. Unicode16位二进制数表示一个字符,可以表示世界上所有语言的所有字符

抽象数据类型

在这里插入图片描述

存储结构

顺序存储

  1. 串的顺序存储结构时用一组地址连续的存储单元来存储串中的字符序列中的。

在这里插入图片描述

链式存储

  1. 串的链式存储结构与线性表相似,但是串的每个结点可以存储一个或多个字符,最后一个结点若未占满则使用#或其他非字符串字符补全
  2. 总体来说,串的链式存储结构不如顺序存储结构灵活,性能也不如顺序存储结构好

在这里插入图片描述

朴素模式匹配算法

  1. 模式匹配是指自串的定位操作
  • 匹配方法:
  1. 对主串的每个字符作为子串的开头,与要匹配的字符串进行匹配;
  2. 对主串进行大循环,每个字符开头都要做T的长度的小循环,直到匹配成功或全部遍历完成为止

在这里插入图片描述

/* 返回子串T在主串中第pos个字符之后的位置。若不存在,则函数返回值为0*/
/* T非空,1<=pos<=StringLength(s) */
int Index(String S, String T, int pos)
{
   
   
	int i = pos; /* i用于主串S当前位置下标,若pos不为1 */
				/* 则从pos位置开始匹配 */
	int j = 1;  /* j用于子串T中当前位置下标值 */
	while(i <= S[0] && j <=T[0])
	{
   
   
		if(S[i] == T[j])  /* 两字母相等则继续 */
		{
   
   
			++i;
			++j;
		}
		else	/* 指针后退重新开始匹配 */
		{
   
   
			i = i - j + 2;  /* i退回到上次匹配首位的下一位 */
		/* i = i - (j - 1) + 1; 其中(j - 1)表示本次匹配i移动的次数*/
		/* i - (j - 1)让i退回到原位置,然后再 +1指向一个位置 */
			j = 1;
		}
	}
	if(j > T[0])		/* 匹配成功:此时j应为T[0]+1因此移动j移动次数为T[0] */
		return i - T[0];   
	else			   /* 匹配失败 */
		return 0;
}

在这里插入图片描述

KMP模式匹配算法

  1. 朴素模式匹配算法会进行大量重复且无用的比较,因此效率很低。
  2. KMP算法:克努力-莫里斯-普拉特算法可以大大避免重复遍历。

在这里插入图片描述

  • 基本思想:
    在这里插入图片描述
    在这里插入图片描述
  1. S = "abcabcabc" "T = abcabx",在①中前5个字符完全相等,第6个字符不等
  2. T的首字符aT的第二个字符b,第三个字符c均不相等,所以不需要做判断,步骤② ③都是多余的
  3. 因为T的首位aT第四位的a相等, 第二位的b与第五位的b 相等。 而在①时, 第四位的a与第五位的b 已经与主串S中的相应位置比较过了, 是相等的;因此可以断定 ,T的首字符a、 第二位的字符bS的第四位字符和第五位字符也不需要比较了,肯定也是相等的,因此步骤 ④ ⑤ 也可以省略
  1. j值的变换和主串没什么关系,关键就取决于子串的结构中是否有重复的问题
  2. 我们把T串各个位置的j值的变化定义为一个数组next,那么next的长度就是T串的长度
    n e x t [ j ] = { 0 ,     当 j = 1 时 M a x     { k ∣ 1 < k < j , 且 ′   p 1   . . .   p k − 1   ′ = ′   p j − k + 1   . . .   p j − 1   ′ } 当 此 集 合 不 空 时 1 ,     其 他 情 况 next[j] = \begin {cases} 0, \text \ \ \ {当j = 1时} \\ Max\ \ \ \{k|1<k<j,且'\ p_1\ ...\ p_{k-1}\ ' = '\ p_{j-k+1}\ ...\ p_{j-1}\ ' \}当此集合不空时 \\ 1, \text \ \ \ {其他情况}\end {cases} next[j]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值