KMP算法是一种字符串匹配算法,用于在文本串中查找模式串的出现位置。在Golang中,可以使用以下代码实现KMP算法。
func KMPSearch(pattern, text string) int {
m := len(pattern)
if m == 0 {
return 0
}
n := len(text)
if n == 0 {
return -1
}
prefix := make([]int, m)
preProcessPattern(pattern, prefix)
j := 0
for i := 0; i < n; i++ {
for j > 0 && pattern[j] != text[i] {
j = prefix[j-1]
}
if pattern[j] == text[i] {
j++
}
if j == m {
return i - m + 1
}
}
return -1
}
func preProcessPattern(pattern string, prefix []int) {
m := len(pattern)
j := 0
i := 1
for i < m {
if pattern[i] == pattern[j] {
prefix[i] = j + 1
j++
i++
} else if j > 0 {
j = prefix[j-1]
} else {
prefix[i] = 0
i++
}
}
}
上面的代码中,KMPSearch函数接受两个参数:pattern和text,分别代表要查找的模式串和文本串。首先,我们对模式串进行预处理,生成一个前缀数组prefix。然后,我们使用两个指针i和j分别在文本串和模式串中遍历,通过比较字符来查找匹配位置。如果找到了匹配位置,就返回其下标。如果最终没有找到匹配位置,则返回-1。
其中,preProcessPattern函数用于生成前缀数组prefix,采用了类似动态规划的思想。在每一步迭代中,我们比较模式串中当前位置和前一个位置的字符是否相等,如果相等,则将prefix[i]设置为j+1,其中j是上一个匹配位置在模式串中的下标。否则,我们将j更新为prefix[j-1],并重复这个过程,直至j等于0或者两个字符相等。
以上代码实现了KMP算法,并且具有很高的效率。




