Skip to content

LeetCode 28 · Go

// LC 28. Find the Index of the First Occurrence in a String
package main

func strStr(haystack, needle string) int {
	n, m := len(haystack), len(needle)
	if m == 0 {
		return 0
	}
	if m > n {
		return -1
	}

	const base uint64 = 256
	const mod uint64 = 1_000_000_007

	var highPower uint64 = 1
	for i := 0; i < m-1; i++ {
		highPower = (highPower * base) % mod
	}

	var needleHash, windowHash uint64
	for i := 0; i < m; i++ {
		needleHash = (needleHash*base + uint64(needle[i])) % mod
		windowHash = (windowHash*base + uint64(haystack[i])) % mod
	}

	for i := 0; i <= n-m; i++ {
		if windowHash == needleHash && haystack[i:i+m] == needle {
			return i
		}
		if i < n-m {
			leading := (uint64(haystack[i]) * highPower) % mod
			windowHash = (windowHash + mod - leading) % mod
			windowHash = (windowHash*base + uint64(haystack[i+m])) % mod
		}
	}
	return -1
}

← Back to the lesson · From The Engineering Handbook (source), CC BY-SA 4.0.