题解:字符串模式匹配
Guderian出品
前置知识:KMP算法
说明
模式匹配是指给定主串t
和子串s
, 在主串t
中寻找子串s
的过程, 其中s
称为模式。 如果匹配成功, 返回s
在t
中的位置, 否则返回-1
。
分析
KMP
算法用 next
数组对匹配过程进行了优化。 KMP
算法的伪代码描述如下:
1. 在串t
和串s
中, 分别设比较的起始下标i=j=0
。
2. 如果串t
和串s
都还有字符, 则循环执行下列操作:
(1) 如果j=-l
或者t[i]=s[j]
, 则将i
和j
分别加1
,继续比较t
和s
的下一个字符;
(2) 否则, 将j
向右滑动到next[j]
的位置, 即j=next[j]
。
3. 如果s
中所有字符均已比较完毕, 则返回匹配的起始位置(从1
开始) ; 否则返回-1
.其中, next
数组根据子串s
求解。 求解next
数组的代码已由get_next
函数给出。
实现
(1)常量和变量说明
t
,s
:长度为lt
和ls
的字符串
next[]
:next
数组,长度为ls
(2)C语言程序
1 |
|
(3)复杂度分析
- 时间复杂度:$O(ls+lt)$
- 预处理$ O(ls)$,匹配$ O(lt)$
- 空间复杂度:$O(ls)$