Go-实现查找某字符在字符串中第一次出现的位置

此算法实现的核心就是每次向后移动一位进行匹配,关键部分next数组,GetNext函数是失效函数,next数据就是匹配串字符串最长匹配前缀和最长匹配后缀的关系。

代码片段如下:

package main

func StringSearch(str, searchStr string) int {
	next := GetNext(searchStr)
	j := 0
	for i := 0; i < len(str); i++ {
		for j != 0 && str[i] != searchStr[j] {
			j = next[j-1] + 1
		}

		if str[i] == searchStr[j] {
			j++
		}

		if j == len(searchStr) {
			return i - j + 1
		}
	}

	return -1
}

func GetNext(needle string) []int {
	next := make([]int, len(needle))
	next[0] = -1
	k := -1
	for i := 1; i < len(needle); i++ {
		for k != -1 && needle[k+1] != needle[i] {
			k = next[k]
		}

		if needle[k+1] == needle[i] {
			k++
		}

		next[i] = k
	}

	return next
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值