Public Class KMP算法
Function 开始(主串 As Int16(), 子串 As Int16(), [Next] As Int32(), 容错值 As Int16) As Int32
Dim 主长度 As Int32 = 主串.Length - 1
Dim 子长度 As Int32 = 子串.Length - 1
Dim i As Int32 = 0
Dim j As Int32 = 0
Dim 运行次数 As Int32
Dim 最相似长度 As Int32
Dim 最相似位置 As Int32
If [Next] Is Nothing Then
Return -1
End If
Do Until j > 子长度 OrElse i > 主长度
If j = -1 OrElse (主串(i) - 容错值 < 子串(j) AndAlso 主串(i) + 容错值 > 子串(j)) Then
If j > 最相似长度 Then
最相似长度 = j
最相似位置 = i
End If
i += 1
j += 1
Else
j = [Next](j)
End If
运行次数 += 1
Loop
Debug.WriteLine($"匹配次数: {运行次数}")
If 最相似长度 > 子长度 * 0.5 Then
Return 最相似位置 - 最相似长度
Else
Return -1
End If
End Function
Function GetNext(子串 As Int16(), 子长度 As Int32) As Int32()
Dim i As Int32 = 1
Dim k As Int32 = 0
Dim [Next](子长度) As Int32
[Next](0) = -1
[Next](1) = 0
Do While i < 子长度
If k = -1 OrElse 子串(i) = 子串(k) Then
k += 1
i += 1
[Next](i) = k
Else
k = [Next](k)
End If
Loop
Return [Next]
End Function
Function GetNextVal(子串 As Int16(), 子长度 As Int32) As Int32()
Dim i As Int32 = 1
Dim k As Int32 = 0
Dim NextVal(子长度) As Int32
NextVal(0) = -1
NextVal(1) = 0
Do While i < 子长度
If k = -1 OrElse 子串(i) = 子串(k) Then
k += 1
i += 1
If 子串(i) = 子串(k) Then
NextVal(i) = NextVal(k)
Else
NextVal(i) = k
End If
Else
k = NextVal(k)
End If
Loop
Return NextVal
End Function
End Class
Private Function 暴力匹配(主串 As Int16(), 子串 As Int16(), 容错值 As Int16) As Int32
Dim 主长度 As Int32 = 主串.Length - 1
Dim 子长度 As Int32 = 子串.Length - 1
Dim i As Int32 = 0
Dim j As Int32 = 0
Dim 记忆i As Int32 = 0
Dim 运行次数 As Int32
Dim 最相似长度 As Int32
Dim 最相似位置 As Int32
Do Until j > 子长度 OrElse i > 主长度
If 主串(i) - 容错值 < 子串(j) AndAlso 主串(i) + 容错值 > 子串(j) Then
If j > 最相似长度 Then
最相似长度 = j
最相似位置 = i
End If
i += 1
j += 1
Else
记忆i += 1
i = 记忆i
j = 0
End If
运行次数 += 1
Loop
Debug.WriteLine($"匹配次数: {运行次数}")
If 最相似长度 > 子长度 * 0.1 Then
Return 最相似位置 - 最相似长度
Else
Return -1
End If
End Function