KMP

不要问为什么,问就是知道了

package main

import "fmt"

func main () {
    res := kmp([]rune("我爱"), []rune("我我爱中国"))
    fmt.Println(res)
}

func kmp(keys []rune, content []rune) (int) {
    next_array := next(keys)

    i, j := 0, 0
    for i < len(content){
        if j == -1 || keys[j] == content[i] {
            i++
            j++
        } else {
            j = next_array[j]
        }
        if j == len(next_array) {
            return i - len(next_array)
        }
    }
    return -1
}

func next(keys []rune) ([]int) {
    var len = len(keys)

    next    := make([]int, len)
    next[0] =  -1

    k := -1
    i := 0
    for i < len -1 {
        
        if k == -1 || keys[i] == keys[k] {
            k++
            i++
            next[i] = k
        } else {
            k = next[k]
        }
    }

    return next
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值