TreeMind树图在线AI思维导图

串思维导图

  收藏
  分享
免费下载
免费使用文件
生杀予夺 浏览量:72023-10-15 15:48:06
已被使用1次
查看详情串思维导图

串介绍

树图思维导图提供 在线思维导图免费制作,点击“编辑”按钮,可对   进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是: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

朴素(BF)模式匹配算法

算法思想

主串长度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算法,当失配时,一趟结束,确定好新的匹配位置时新的一趟开始

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思维脑图 在线思维导图免费制作,点击“编辑”按钮,可对 python思维脑图  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:a0bddae97bad22c753cc657ebce5d661

字符串操作函数与正则表达式思维导图

树图思维导图提供 字符串操作函数与正则表达式 在线思维导图免费制作,点击“编辑”按钮,可对 字符串操作函数与正则表达式  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:bb0f2ee42fa002a8fd111f8f761cc152