KMP算法是一种高效的字符串搜索算法,它通过预处理模式字符串(s2
),创建一个部分匹配表(next
数组),来避免在搜索过程中的不必要比较。
这里声明了两个函数:get_next
用于生成部分匹配表,KMP
用于实际的字符串搜索。
生成部分匹配表的函数
get_next
函数接收模式字符串s
和用于存储部分匹配值的数组next
。
初始化i
和j
,next[0]
设为-1。
循环遍历模式字符串,i
是当前字符的位置,j
是前一个匹配字符的位置。
如果j
为-1或当前字符与j
位置的字符相同,则i
和j
都加1,并将j
的值赋给next[i]
。
如果当前字符与j
位置的字符不同,则j
更新为next[j]
。
KMP搜索函数
KMP
函数接收文本字符串s1
、模式字符串s2
和部分匹配表next
。
初始化i
和j
,分别用于遍历文本和模式字符串。
循环直到i
或j
达到各自字符串的长度。
如果j
为-1或当前字符s1[i]
与s2[j]
相等,则i
和j
都加1。
如果当前字符不同,则j
更新为next[j]
。
如果j
达到或超过模式字符串的长度,则返回匹配的起始位置(i-len2+1
)。
如果遍历完整个文本字符串都没有找到匹配,则返回-1。
主函数
next
数组用于存储get_next
函数生成的部分匹配表。
s2
是模式字符串。
s1
是要搜索的文本字符串。
调用get_next
函数生成部分匹配表。
调用KMP
函数进行搜索,并打印出匹配的起始位置。
如果没有找到匹配,则返回-1。