串介绍
树图思维导图提供 串 在线思维导图免费制作,点击“编辑”按钮,可对 串 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e7d670ab8c8be50acaea175a2eca9cfb
串思维导图模板大纲
定义
即字符串(string)由0个或多个字符组成的有限序列;
术语:串长、空串、子串、主串、字符在主串中的位置、子串在主串中的位置
空串:不含任何字符的串,长度为0
子串:一个字符串中任意个连续的字符组成的子序列
vs线性表
串的数据对象为字符集
串的基本操作大多以子串为操作对象
基本操作
Index(S,T):找到串T在主串S中的位置
StrCompare(S,T):比较操作,若S>T,返回>0;S=T返回0;S<T,返回<0
SubString(Sub,S,pos,len):求子串,从pos起长度为len的子串;
n个字符的字符串,非空子串最多n(n+1)/2个
注意,求子串时如果有两个相同的字符,但是所处位置不同,这是不同的子串!
rep(T,P,S):将T中所有出现的P都替换成S的运算
concatstr(S,T):S后面接上T
算法思想
主串长度n,模式串长度m
将主串中所有长度为m的子串与模式串比较
找到第一个与模式串匹配的子串并返回起始位置
若都不匹配返回0
注意点
最坏时间复杂度:O(mn),此时每个子串都对比了m个字符,前面都相同就最后字符一个不同
朴素模式匹配代码,重点在于i = i - j + 2,因为这里i从1开始,如果从0开始是+1
循环也可以修改为while(i<=m-n&&j<n),最后循环结束判断改为if(i<=m-n && j==n)
无论是BF模式匹配还是KMP算法,当失配时,一趟结束,确定好新的匹配位置时新的一趟开始
基本思路
先根据模式串T求出next数组,next数组只和模式串有关与主串无关
利用next数组进行匹配
KMP算法
利用next数组,KMP模式匹配算法
注意点
匹配成功(j超过模式串长度),返回i - 模式串长度,即为第一个子串出现位置
求next数组时间复杂度O(m)
模式匹配时间复杂度O(n)
总时间复杂度O(m + n)
主串指针i不用回溯
求next数组
手算求next数组
next[1]无脑写0
next[2]无脑写1
其他next:在不匹配的位置前,划一条分界线,i,j双指针不动,模式串向后移,直到分界线之前“能对上”,或者模式串跨过了分界线,此时j所指就是next[j]
算法思路
公式
从不匹配位置开始,找之前所有字符中,最长公共前后缀相同的子串,让最长公共前缀移动到相应的最长公共后缀,next[j]即为最长公共前后缀长度+1
1)模式串第一个字符不匹配 2)k是下次比较位置,j-k是右移距离,k最大j-1,至少右移1位 3)其他情况,找不到最长公共前后缀相同的子串,模式串从第1个字符开始匹配
举例说明
代码求next数组
代码求next数组,看成一个模式匹配问题
KMP进一步优化:求nextval数组
基本思路:列出如上next表格,看j对应的模式串字符和next[j]对应的模式串是不是相等,一旦相等,就把next[j]改为next[j]所对应的next[j],即nextval[next[j]]
代码实现时,在i++,j++后再次判断T[i]和T[j],如果不相等就nextval[i] = j;否则nextval[i] = nextval[j];
顺序存储
静态数组实现
定长顺序存储
动态数组实现
堆分配存储
链式存储
各结点存一个字符:存储密度低
各结点存储多个字符
树图思维导图提供 python思维脑图 在线思维导图免费制作,点击“编辑”按钮,可对 python思维脑图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:a0bddae97bad22c753cc657ebce5d661
树图思维导图提供 字符串操作函数与正则表达式 在线思维导图免费制作,点击“编辑”按钮,可对 字符串操作函数与正则表达式 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:bb0f2ee42fa002a8fd111f8f761cc152