串的模式匹配

在长文本中查找模式串,KMP 比暴力匹配高明在:先求出模式串的 next 数组, 匹配失配时让模式整体右滑、文本指针 i 从不回退。整体复杂度 O(n + m), next 数组记录的正是模式串自身的前后缀结构。

串的模式匹配
01 / 50 步
文本串(17 字符):acabaabaabcacaabc;模式串(8 字符):abaabcac。第一步先求 next 数组。 比较 0 · 交换 0
伪代码

				
					
					1
					procedure getNext(t, m, next)
				
			
				
					
					2
					  j = 1; k = 0; next[1] = 0
				
			
				
					
					3
					  while j < m do
				
			
				
					
					4
					    if k = 0 或 t[j] = t[k] then
				
			
				
					
					5
					      j++; k++; next[j] = k
				
			
				
					
					6
					    else
				
			
				
					
					7
					      k = next[k]        // 前缀回退
				
			
				
					
					8
					  end while
				
			
				
					
					9
					procedure KMP(s, n, t, m)
				
			
				
					
					10
					  i = 1; j = 1
				
			
				
					
					11
					  while i <= n 且 j <= m do
				
			
				
					
					12
					    if j = 0 或 s[i] = t[j] then
				
			
				
					
					13
					      i++; j++
				
			
				
					
					14
					    else
				
			
				
					
					15
					      j = next[j]        // 模式右滑,i 不回退
				
			
				
					
					16
					  end while
				
			
				
					
					17
					  if j > m then return i - m
				
			
				
					
					18
					  else return 0
				
			
01 / 50
速度