1 Star 0 Fork 0

可以提交但没必要/LeetCode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
KMP.go 1.03 KB
一键复制 编辑 原始数据 按行查看 历史
可以提交但没必要 提交于 2018-01-22 13:35 . add some problem
package leetcode
//时间复杂度为o(n)其中n为str长度
func getNext(model string) []int {
len := len(model)
// 声明动态长度为len的一个next数组
next := make([]int, len)
for i := 1; i < len; i++ {
// 无非归零,归一,加一三种情况
if next[i-1] > 0 && model[next[i-1]] == model[i] {
next[i] = next[i-1] + 1
} else if model[0] == model[i] {
next[i] = 1
}
// 不修改表示next[i]=0
}
return next
}
//时间复杂度为o(m)其中m为str长度
func KMP(model, target string) bool {
next := getNext(model)
same := 0
// 保证i始终不退回,j尽量少退回
for i, j := 0, 0; i < len(target); i++ {
if model[j] == target[i] {
same++
j++
} else if j > 0 {
// 前面一位的next值表示各种回退后此时匹配的字符数
same = next[j-1]
// j就回退到same的值,前j位都匹配完成了,只需要往后匹配
j = same
}
if same == len(model) {
// 此时刚好匹配完成,开始位置为i-length+1,结束位置为i
return true
}
}
return false
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/housirvip/LeetCode.git
git@gitee.com:housirvip/LeetCode.git
housirvip
LeetCode
LeetCode
master

搜索帮助