func
strstr
(haystack string
, needle string
)int
if n < m
next, q :=
getnext
(needle),0
for i :=
0; i < n; i++
if(haystack[i]
== needle[q])if
(q == m)
}return-1
}
如果理解了next的作用就好辦了,獲取next陣列的過程其實是相同的邏輯:
//pattern(簡稱pat)
func
getnext
(pat string)[
]int
if pat[k]
== pat[q]
next[q]
=k;}
return next
}
獲取next陣列:
指向目標串的下標q是不停前進的。
指向對比串的下標k是可以回退的。
獲取next陣列其實就是pat串和pat串匹配的過程,只不過指向目標串的下標要比對比串的下標先走一步(q=1, k=0)。迴圈過程會遇到兩種情況:
1、失配:回退找最長相同字首字串的下一位繼續匹配,持續失配將回退至起點為止。
2、匹配:k++,目的是為了讓next[q]得到最長相同字首的下一位。
每個迴圈,next[q]都可以得到最長相同字首的下一位,或0。
使用next陣列:
指向目標串haystack的下標i是不停前進的。
指向對比串needle的下標q是可以回退的。
使用next陣列是haystack串和needle串匹配的過程,下標同時起步(i=0,q=0),迴圈過程會遇到兩種情況:
1、失配:先需要知道最長相同字首字串的位置是在q-1(因為在q位失配了),再用next[q-1]跳轉到最長相同字首字串的下一位,繼續比較,持續失配將回退至起點為止。
2、匹配:q++,進入到下一位。
如果q等於needle串的長度,說明已經全部匹配完成了,這時候可以得到串的起始位置:i+1-m
LeetCode第28題 實現strStr
題目實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。class solution object defstrstr self,haystack,needle ...
LeetCode28 實現strStr 水題
一開始的想法是 取needle的第乙個字元開始唄,遇到合適的再比第二個。如果是找到的話,肯定是乙個個比對完了。找不到的情況就是,needle字串比haystack剩下的字串長了。能夠跳的情況.算了,還是一步步來,這個不合適就比對下乙個。比如原串1112,子串112,不好跳。要注意一些情況就行了 這裡...
28 實現 strStr (暴力)
1.問題描述 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 ha...