数据结构复习(4)
第四章——串
字符串存储
一般有定长空间分配法,不定长分配两种方式。
后者以 \0
字符来作为字符串结尾,前者需要再存储一个字符串长度,超出长度之外的字符是无效的。
串的模式匹配算法
假设主串长度为 n,模式串长度为 m。
暴力匹配即对于每一个可能出现模式串的位置(n)对模式串进行匹配判断(m),时间复杂度显而易见的是 O(mn)。
KMP算法会构建一个 Next 数组,在匹配的时候,每一次失配,我们都让模式串指针跳转到 next[j] 的位置上去,主串位置不变。
构建Next数组的方法:
1 | for(int i=1;i<n;i++){ |
匹配的方法:
1 | int find_str(char *s1,char *s2){ |
next数组的值,如果字符串下标是从0开始的,那么当前next数组的值等以不包括当前字符的前缀为子串,对子串进行最大公共真前后缀的长度值。特别的,第一个值为-1。
如果是 1 开始的,那么值整体 + 1。因为第一位失配,我们需要做的应该是模式串和主串都后移一位,用于特判。
对于KMP的改进,就是如果自己和next值的数是相等的,那么直接把next的值指向自己next值的next值即可。
其它没有什么内容了,也不会考算法题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xia0ji233's blog!