数据结构(4)--------------- 串
目录
1、定义
2、串的基本操作
3、串的存储结构
4、基本操作实现
4.1、求子串
4.2、比较两个字符串大小
4.3、定位操作
5、字符串相关算法
5.1、朴素模式匹配算法
5.2、KMP算法
5.2.1、实现思想
5.2.2、求next数组
5.2.3、KMP进一步优化
1、定义
串,即字符串是由0个(空串)或多个字符组成的有限序列。
字串:串种任意个连续的字符组成的子序列;
主串:包含字串的串;
字符在主串中的位置:字符在串种的序号;
子串在主串种的位置:子串的第一个字符在主串种的位置;
2、串的基本操作
3、串的存储结构
顺序存储:
链式存储:
4、基本操作实现
4.1、求子串
4.2、比较两个字符串大小
4.3、定位操作
5、字符串相关算法
5.1、朴素模式匹配算法
比如在word或搜索引擎内匹配一段文字,也就是在主串种找到与模式串相同的子串;(模式串中不一定能在字串中找到)
实现方法:
1、直接暴力检索,将主串中所有长度为m的子串依次与模式串对比(若比对失败则向右移动1位并继续匹配),直到找到一个完全匹配的子串,或所有子串都不匹配为止;(之后返回匹配到的子串的头位置就行)
5.2、KMP算法
5.2.1、实现思想
朴素模式匹配算法的优化版本。(相比于朴素模式,此时的主串指针是不要进行回溯的)
实现思路:
1、在i的位置匹配失败;
2、让j回到1,并从i=5的位置,也就是上一次匹配失败的位置开始匹配。相比于朴素匹配,这样会少几个匹配步骤;
5.2.2、求next数组
也就是求“模式串”在哪个字符上出现匹配失败的情况时,我们的模式串指针j需要从模式串字符中的哪个位置重新开始匹配。具体如下:
算法中需要传入next数组,以确认当前模式串是否匹配:
、
5.2.3、KMP进一步优化
如果旧位置指向的字符与当前位置指向的字符是一样的,那我们就可以将模式串的指针移动到首位。因为此时去匹配字符必定会失败。(这里其实只是优化了next数组)
具体如下图中next数组中的3号和5号字符。
已知next数组,求其优化数组方法:(其实就是看next数组匹配失败后,跳转到模式串中的那一个数组位置的元素,是不是和当前匹配失败的元素一致,若一致则直接跳转到那个元素匹配失败时所要跳转的位置)