func KMP(src, pat string) int {
if pat == "" {
return 0
}
ls := len(src)
lp := len(pat)
next := make([]int, lp)
for i, j := 1, 0; i < lp; i++ {
for j > 0 && pat[i] != pat[j] {
j = next[j-1]
}
if pat[i] == pat[j] {
j++
}
next[i] = j
}
for i, j := 0, 0; i < ls; i++ {
for j > 0 && src[i] != pat[j] {
j = next[j-1]
}
if src[i] == pat[j] {
j++
}
if j == lp {
return i - lp + 1
}
}
return -1
}