kmp 實現strstr()
阿新 • • 發佈:2020-07-13
題目:
實現 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) }