找出字符串中第一个匹配项的下标

27 阅读1分钟

暴力解法

func strStr(haystack string, needle string) int {
	//go 在字符串中,找指定子串下标的方法,有没有现成的函数
	//for i := 0; i < len(haystack)-len(needle); i++ { //这里是<=不是<,因为两个len多出的长度1相减,抵消了
	for i := 0; i <= len(haystack)-len(needle); i++ {
		if strings.HasPrefix(haystack[i:], needle) {
			return i
		}
	}
	return -1
}

自己实现 startWith 函数

func hadPrefix(s, subS string) bool {
	for i := 0; i < len(subS); i++ {
		if s[i] != subS[i] {
			return false
		}
	}
	return true
}

优化

根本不需要 startWith,直接切片判断是否相等

func strStr(haystack string, needle string) int {
    n, m := len(haystack), len(needle)
    for i := 0; i <= n-m; i++ {
        if haystack[i:i+m] == needle {
            return i
        }
    }
    return -1
}

这个可以用 KMP 算法,但是比较复杂,先不考虑