1. 程式人生 > 實用技巧 >kmp 實現strstr()

kmp 實現strstr()

題目:

實現 strStr() 函式。

給定一個 haystack 字串和一個 needle 字串,在 haystack 字串中找出 needle 字串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。

示例 1:

輸入: haystack = "hello", needle = "ll"
輸出: 2
示例 2:


輸入: haystack = "aaaaa", needle = "bba"
輸出: -1
說明:

當 needle 是空字串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。

對於本題而言,當 needle 是空字串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符

解題思路:

1,用暴力解法,時間複雜度是O(mn)

2,使用kmp演算法是用空間換時間,用O(m)的空間可以獲得O(m+n)的時間複雜度

3,next陣列的作用:記錄當前的字尾字串與字首子串最大匹配長度。已經比較過的地方可以不用比較

4,思想和dp很像,但是空間複雜度O(m)比dp O(mn)低

package main

import "fmt"

func strStr(haystack string, needle string) int {
	if haystack==needle || needle==""{
		return 0
	}
	if len(needle)==0{
		return -1
	}
	next:=getNext(needle)
	m:=0
	for i:=0;i<len(haystack);i++{
		for m>0 && haystack[i]!=needle[m]{
			m=next[m-1]
		}
		if haystack[i]==needle[m]{
			m++
			if m==len(needle){
				return i-m+1
			}
		}
	}
	return -1
}

func getNext(needle string)[]int{
	next:=make([]int,len(needle))
	i:=0
	for j:=1;j<len(needle);j++{
		for i>0 && needle[i]!=needle[j]{
			i=next[i-1]
		}
		if needle[j]==needle[i]{
			i++
		}
		next[j]=i
	}
	return next
}

func main() {

	haystack := "hello"
	needle := "ll"
	res :=strStr(haystack, needle)
	fmt.Println(res)
}

  地址:https://mp.weixin.qq.com/s/6as6S1SbqMh1Fw5EURj-9A