KMP算法 GO实现

2 篇文章 0 订阅

KMP 算法的 核心就是求next的数组
next 数组中 存储的值是 匹配失败之后 子串要回溯的位置
网上的例子 求解next 都有细微的偏差
最终实现的效果 都是一样
参考链接:https://www.cnblogs.com/dusf/p/kmp.html

//普通字符串匹配
func Sindex(S,T string) int {
	i := 0
	j := 0
	//同时满足才可以  找除字符串出现的第一个位置
	for ;i <= len(S) -1  && j <= len(T) -1;{
		if S[i] == T[j]{
			//当字符匹配时 i j 都加1
			i++
			j++
		}else{
			//不匹配 j 回溯到第一个字符 为 0   i 回溯 从下一个字符开始匹配
			i = i -j +1
			j = 0
		}
	}
	//如果 j 大于 或者 等于 T串的长度 说明匹配成功
	if j >= len(T) -1 {
			return i - len(T) +1
		}

	return 0
}

//next数组 获取
func get_next(T string) [20]int {
	var i,j int
	var next [20]int
	i = 0
	j = -1
	next[0] = -1
	for ;i<len(T)-1; {
		
		if j == -1 || T[i] == T[j]{
			
			j++
			i++
			if T[i] == T[j] {
				next[i] = next[j]
			}else{
				next[i] = j
			
			}
			
			
		}else{
			
			j = next[j]
		}
		
	}
	return next
}

//KMP字符串匹配 
func SindexKMP(S,T string) int {
	next := get_next(T)
	fmt.Println(next)
	i := 0
	j := 0
	//同时满足才可以  找除字符串出现的第一个位置
	for ;i <= len(S) -1  && j <= len(T) -1;{
		
		if j == -1|| S[i] == T[j]{
			//当字符匹配时 i j 都加1
			i++
			j++
		}else{
			//子串的 偏移量 从next数组中取  i 不变
			j = next[j]
		}
	}
	//如果 j 大于 或者 等于 T串的长度 说明匹配成功
	if j >= len(T) -1 {
		return i - len(T) +1
	}

	return 0
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值