字符串-BF算法-KMP算法

字符串:

用数值模拟非数值:ASCII码表

串:由0个或多个字符组成的有限序列

#空格也是一个字符

#子串和主串:“over”是“lover”的子串

字符相比较:比大小-ASII码大小--但并没什么意义--主要看是否相等

存储结构:与线性表相同:顺序和链式

顺序存储:事实上就是用数组

不同的字符串一般是连在一起表述的-习惯上会用数组


BF算法:(brute force)

属于朴素的模式匹配算法,核心思想是:

有两个字符串S、T,长度分别为N、M。首先S[1]和T[1]比较,相等-在比较S[2]和T[2]

,不等-T向右移动一个字符的位置,依次比较

S是主串,T是子串,效率极其低下


KMP算法:

核心:避免不必要的回溯

子串中失配前面最近的是后缀,在在前面的是前缀(第一个永远是前缀,最后的一定是后缀)

子串失配处下一次匹配处为:前缀和后缀相等的元素+1

#需要找到子串中前后缀重复的字符串个数

Next数组:当模式匹配串T失配的时候,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配


i(后缀)j(前缀)T(0)是字符串长度

void get_next(string T,*next)

{

Next[1]=0 ;

j=0 ;

i=1;

Whlie(i<T(0))

{

if(T(i) = =t(j) || j==0)

{

//后缀是相对的,前缀是是固定的

i++;

j++;

next[i] = j;

}

else

{

j=next[j]

//j回溯

}

}

}

#KMP就是对BF算法的改善

两个算法的代码很相似,只有匹配不成功后重新匹配的点在哪里不同


KMP算法也有缺陷:效率不会是最好的,一些特殊情况下效率也比较低

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容