kmp算法

111 阅读1分钟
// 生成next数组
func getNext(t []string) []int {
	tLen := len(t)
	next := make([]int, tLen)
	for i, _ := range next {
		//整体记录的个数都比实际少1
		next[i] = -1
	}
	for i,j := 1,-1; i < tLen ; i++ {
		//1)j !=-1(不加会数组下标溢出,next[-1]不存在)
		//2)j = next[j]进行回溯
		for j != -1 && t[j + 1] != t[i] {
			j = next[j]
		}
		//正常判断元素是否相等,相等的话j往后移动一位
		if t[j + 1] == t[i] {
			j++
		}
		//记录当前最长最前匹配的个数-1
		next[i] = j
	}
	fmt.Println(next)
	return next
}

func kmp(s []string, t []string) int {
	next := getNext(t)

	sIndex, tIndex := 0, 0
	for  sIndex < len(s) && tIndex < len(t) {
		if tIndex != 0 && s[sIndex] != t[tIndex] {
			tIndex=next[tIndex-1] + 1
		} else if tIndex == 0 && s[sIndex] != t[tIndex] {
			sIndex++
		} else {
			sIndex++
			tIndex++
		}
		//fmt.Println(sIndex, "+++++++", tIndex)
	}
	fmt.Println(tIndex)
	fmt.Println(sIndex)
	if tIndex == len(t) {
		return sIndex - tIndex
	}
	return -1
}

func main() {
	//getNext([]string{"a", "b", "a", "a", "c", "b", "a", "b", "a", "a", "b"})
	//getNext([]string{"G","T","G","T","G","C","F"})
	s := []string{"G","T","G","T","G","A","G","C","T","G","G","T","G","T","G","T","G","C","F","A","A"}
	t := []string{"G","T","G","T","G","C","F"}
	fmt.Println(kmp(s, t))
}