4.1 数据结构——串
4.1.1 串的定义
1、定义:串(string)是由零个或多个字符组成的有限序列,又称为字符串。
一般记作:,其串中的字符数目n称为串的长度,当n = 0时,该串称为空串(null string)。
2、子串:串中任意个连续字符组成的子序列称为该串的子串。
3、主串:包含子串的串相应地称为主串。
4、字符位置:字符在序列中的序号称为该字符在串中的位置。
5、子串位置:子串第一个字符在主串中的位置。
6、空格串:有一个或多个空格组成的串,与空串不同。
7、串相等:当且仅当两个串的长度相等,并且各对应位置上的字符都相同时,这两个串是相等的。
4.1.2 串的抽象数据类型定义
ADT String
{数据对象:D = {ai | ai ∈ CharacterSet, i = 1, 2, ..., n, n >= 0}数据关系:R = {<ai-1, ai> | ai-1, ai ∈ D, i = 2, 3, ..., n}基本操作:StrAssign(T, chars) //串赋值StrCompare(S, T) //串比较StrLength(S) //求串的长度ComCat(T, S1, S2) //串连结SubString(Sub, S, pos, len) //求子串StrCopy(T, S) //串拷贝StrEmpty(S) //判断串是否为空ClearString(S) //清空串Index(S, T, pos) //子串的位置Replace(S, T, V) //串替换StrInsert(S, pos, T) //串的插入StrDelete(S, pos, T) //串的删除DestoryStr(S) //串销毁
}ADT String
串的存储结构:
串中元素逻辑关系与线性表相同,串可以使用与线性表相同的存储结构,使用了顺序存储结构的串称位顺序串,使用链式存储结构的串称为链串。
4.1.3 串的顺序存储结构
#define MAXSIZE 255typedef struct
{char ch[MAXSIZE + 1]; //存储串的一维数组int length; //串的当前长度
}SString;
4.1.4 串的链式存储结构
//串的链式存储结构——块链结构
#define CHUNKSIZE 80 //块的大小typedef struct Chunk
{char ch[CHUNKSIZE];struct Chunk *nexe;
}Chunk;typedef struct
{Chunk *head; //串的头指针Chunk *tail; //串的尾指针int curlen; //字符串中块链的长度
}LString;
4.1.5 串的模式匹配
1、算法目的:确定主串所含子串(模式串)第一次出现的位置。
2、算法种类:
BF算法(Brute-Force),又称简单匹配算法,采用穷举法的思路。
算法的思路是从S的每一个字符开始依次与T的字符进行匹配。
int Index(SString S, SString T, int pos)
{int i = pos;int j = 1;while (i <= S.length && j <= T.length){if (S.ch[i] == T.ch[j]){i++;j++;}else{i = i - j + 2;j = 1;}}if (j >= T.length -1)return i - T.length;else return -1;
}
KMP算法,是由D.E.Knuth、J.H.Morris和U.R.Pratt共同提出的,简称KMP算法。
KMP算法的重点是当子串的某一个字符与主串不同时,主串不用回溯,子串回溯到当前字符位置之前的字符串最长前缀的下一个字符继续比较。
一个字符串的前缀和后缀相同且长度相同且是非字符串本身,称为最长相等前后缀。
字符串{A,B,C,A,B}的前缀集合是{A, AB, ABC, ABCA};后缀集合是{B, AB, CAB, BCAB}。它的最长前缀是AB,长度为2,当ABCABA最后一个字符与主串不相符时,子串回溯到最长前缀的后一个字符,即C的位置,继续比较。
下面结合图例来讲解:
关于主串和模式串不匹配时,j要回溯到哪个位置?
P[i] != S[j]时,j要回溯到哪个位置是重点,ABA最长相等前后缀是,所以j要回溯到1的位置,即:
当j回溯后再进行比较 ,此时P[i] != S[j],要继续回溯,而j前面只有一个元素,最长相等前后缀为0,所以要回溯到0这个位置,即:
再继续进行比较,发现P[i] != S[j],此时j前已经没有元素了,i要往后移动,即:
使用KMP算法时,我们会用一个next数组来保存子串的最长相等前后缀,而KMP算法最关键的就是求next数组。
当P[k] = P[j]时,即 0 ~ k 和 j-k ~ j 的序列相同,所以有next[j+1] = next[j] + 1。
如果P[k] != P[j]呢?我们要回溯到哪个位置?要回溯到0~k-1的最长相等前后缀的位置,它的最长相等前后缀是next[k],所以k要回溯到k=next[k]这个位置。
求next数组
因为next[0]和next[1]的最长相等前后缀都是0,为了方便计算next数组,我们将next[0] = -1。
void getNext(String ps, int next[]) {next[0] = -1;int j = 0;int k = -1;while (j < ps.length - 1) {if (k == -1 || ps[j] == ps[k]) {next[++j] = ++k;}else {k = next[k];}}
}
KMP算法实现
int KMP(String ts, String ps, int pos, int len)
{int i = pos; // 主串的位置int j = 0; // 模式串的位置int next[len];getNext(ps, next);while (i < ts.length && j < ps.length) {if (j == -1 || t[i] == p[j]) { i++;j++;} else {j = next[j]; // j回到指定位置}}if (j == p.length) {return i - ps.length;} else {return -1;}}
4.1 数据结构——串相关推荐
- 数据结构串之寻找整数
输入一个字符串,内有数字和非数字字符,如:ak123x456 17960?302gef4563,将其中连续的数字作为一个整体,依次存放到一数组a中,例如123放入a[0],456放入a[[1]],- ...
- Java数据结构-串及其应用-KMP模式匹配算法
1.前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而且这个算法的不少 ...
- 数据结构-串操作应用之词索引表
为书库创建查询索引表 建立词索引表基本步骤: 1.从书目文件中读入一个书目单. 2.从书目单中提取所有关键字插入词表. 3.对词表中的每一个关键字在索引表中进行查找并作相应的插入操作. 详细操作: 1 ...
- 数据结构—串-基本知识点(第五章)
目录 1. 串的定义 2. 串的比较 3. 串的抽象数据类型 4. 串的存储结构 4.1 串的顺序存储结构 4.2 串的链式存储结构 5. 朴素的模式匹配算法 6. KMP模式匹配算法 1. KMP模 ...
- 数据结构-串、数组和广义表
选择题 1.串是一种特殊的线性表,其特殊性体现在( ). A.可以顺序存储 B.数据元素是一个字符 C.可以链式存储 D.数据元素可以是多个字 ...
- 数据结构--串、数组、广义表
串 串(String):零个或多个任意字符组成的有限序列 空串用∅表示 子串:一个串中任意个连续字符组成的子序列(含空串)称为该串的子串 真子串是指不包含自身的所有子串 几个术语 子串:串中任意个连续 ...
- [数据结构] - 串
简介 字符串(String)是由字符组成有限序列,是常用的一种非数值数据,串的逻辑结构是线性表,串是一种特殊的线性表,限制其元素类型是字符,串的操作特点与线性表不同,主要对子串进行操作,通常采用顺序存 ...
- python数据结构-串
串 字符串也叫串,是由字符组成的有限序列,是一种常用的非数值数据 串的逻辑结构是线性表,其每个数据元素都是一个字符 串主要是对子串进行操作 通常采用顺序存储结构存储 为什么不用链式呢?字符串都是一段序 ...
- java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法
串(string)是由零个或多个宇符组成的有限序列,又名叫字符串. 定义的解释: ??串中的字符数目n称为串的长度,定义中谈到"有限"是指长度n是一个有限的数值. ??零个字符的串 ...
- 数据结构—串的详细解释(含KMP算法)
1.1串的定义 串:串是由零个或多个字符组成的有限序列,又叫字符串(其的存储结构包含顺序表存储.单链表存储的形式.) 一般记为s="a1a2a3....an"(n>=0),其 ...
最新文章
- soapui工具_基于开源的API测试工具!不再为web服务负载测试而发愁
- C#直接用数字定义背景颜色
- 增加话务系统功能感想
- Boost字符串处理
- JSTL之数字、日期格式化fmt:formatNumber/、fmt:formatDate/
- Python笔记-Json转DataFrame(基金主题Json数据)
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
- 基于深度神经网络的噪声标签学习
- 单摆运动属于什么现象_物理模型中的隐含条件是什么
- vimnbsp;自动识别UTF8和GB2312
- Android之反编译
- 数字IC手撕代码--投票表决器
- 神奇宝贝服务器服务器修改器,pkhex修改器最新版
- MATLAB零基础入门教程视频课程
- 现代城市生态与环境学
- 服务器安装esxi系统
- SQL注入案例演示与防范措施大全
- 淘宝接口 http://ip.taobao.com/service/getIpInfo.php?ip=myip 获取不到手机ip地址
- scala either_使用Either和Option处理功能错误
- 如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?
热门文章
- 重复代码 Duplicated Code
- 目前绝大多数处理语言先验性文章总结
- 卷积学习与传统稀疏编码、ICA模型学习区别(逐步补充)
- IntelliJ IDEA快速入门 | 第一篇:你不会还不知道IntelliJ IDEA吧!不要太low哦!
- Alax技术实现的基本原理——XMLHttpRequest对象的使用
- 枚举类与注解(复习)
- (React入门)ref
- 抗混叠滤波matlab实现,关于设计抗混叠滤波器容易忽视的三条建议
- unity 设置图片九宫格_Unity UGUI篇 Image图片
- 各大公司数据结构与算法面试题解答(一)