串的相关算法(子串、BF算法、KMP算法)

串的相关算法

一、定义

是由0个或多个字符组成的有序队列。
与其他的区别:数据元素是字符。
特殊:空串:长度(n)等于0。
主串:
子串/模式串:在主串中取任意个连续字符组成的。
计算子串:(0)当每一个字符都不一样是——推公式;

注意约定:其中空串与主串本身这两个字符串也算做字串;
如果不做说明:字串不包含空串!!!

包含1个字符的子串共n个
包含2个字符的子串共n-1个
包含3个字符的子串共n-2个
包含4个字符的子串共n-3个
.。。。。。
包含n个字符的子串共1个
空串1个
综上所述:子串个数共:1+2+3+。。。+n+1(空串)=n(n+1)/2+1
比如:abc=就有a b c ab bc adc 0,==7个
其中bc不是连续的,所以不是

(1)有字符重复——设都不同计算后减去相同的;

还是要注意约定:非不飞空,包不包含本身;

:aaabb.cdf 所有飞空字串包含本身,但(两个字串内容相同则算一个)
1.假设:9个全不相等;
则:(9*10)/2=45;
2.去相同
aaa中有2个a相同;
bb中有1个b相同;
3.最后
45-3=42;

二、算法/模式匹配

BF算法
——1.在主串S与子串T(模式串)设比较初始的下标为i与j;
2.循环直到S或T的所有字符均比较完
(1).如S【i】=T【j】,i++,j++;
(2).否则将i和j回溯;再进行下一轮的比较
其中回溯是:i回到上一次start的下一个.。。j回到1
时间复杂度:O(n*m)
串的相关算法(子串、BF算法、KMP算法)_第1张图片
缺点:时间性能低;
不成功存在大量的回溯;

KMP算法
——在BF算法的基础上,在2中的(2)否则
i保持不动j回溯到next[j]位置;
(2)1,j一直回溯到0,则i,与j 都加1。准备下一轮;
时间复杂度:O(n+m)
串的相关算法(子串、BF算法、KMP算法)_第2张图片
重点是:求next[j]
比如:T为:abab;
则:a b a b
值:0 1 1 2
首字符为0;是约定。
第2位,向左右看只有1个不存在相同.0+1=1;
第3位,向左看一个有 b,右看有a,不同相同;
向左看两个有a b,但与上面第2位一样;所以最后是0+1=1.
第4位,向左看一个有 a,右看有a,相同;
向左看两个有b a,右看有a b,不同;所以最后是1+1=2.
同理:aaaab的next[j]=01234;

在KMP算法的next[j]再改进为nextval[j];
——1.next[j]=nextval[j]
2.比较t.date[j]与t.date[k]
(1)相等时,同化:nextval[j]=next[j]

(2)不相等时,落下:nextval[j]=nextval[k]

串的相关算法(子串、BF算法、KMP算法)_第3张图片

你可能感兴趣的:(子串的计算,BF算法,串的知识点)