雙指標,KMP 實現字串定位

2021-10-10 20:23:11 字數 2226 閱讀 8158

像我這種菜雞就喜歡用暴力的方法來求解,我這個方法實際上就是乙個字串乙個字串的比對,如果相同就進入迴圈乙個乙個字串進行比對,如果比對完全匹配就返回匹配結果反之。

func

strstr

(haystack string

, needle string

)int

// 字串比對開始位置

t :=

0// 開始遍歷haystack

for i :=

0; i <

len(haystack)

; i++

t++// 如果匹配到末尾就說明匹配成功

if j ==

len(needle)-1

// 這裡我們判斷t是否越界

if t >=

len(haystack)}}

}return-1

}

這裡的雙指標法其實已經說得很明顯了,我們通過兩個指標來分別定位原始字串和查詢的字串,如果發現相同的字串,那麼就開始準備匹配,如果匹配過程中沒有匹配完,那麼就把指標重新置為剛開始匹配的那個字串,如果匹配完畢,那麼就直接返回位置

func

strstr

(haystack string

, needle string

)int

iflen

(needle)

>

len(haystack)

var i, j int

//定義指標i,j分別對應haystack和needle

var index =-1

//index位置初始值-1

for i <

len(haystack)

&& j <

len(needle)

if j ==

len(needle)-1

j++//否則needle的指標j往後移動一位

}else

} i++

//不管上面怎麼變動,haystack的指標每次都要往後移動一位

}return-1

}

next陣列的詳解

/* 計算next陣列 這個陣列也叫匹配表陣列(這個陣列的長度就是haystck的長度)

這裡解釋一下這個陣列的意思 解釋之前先理解一下字首和字尾的概念

字首: 例如」harry」的字首包括

字尾:例如,」potter」的字尾包括

這個兩個其實乙個是正過來乙個個的往後加 字尾就是反過來的

然後我們計算的這個表就是每位所包含的相同前字尾的最長的長度

對於字串」ababa」,它的字首集合為,它的字尾集合為, 兩個集合的交集為,其中最長的元素為」aba」,長度為3。

我們拿ababa來舉例 這個表有5位,第一為就是a的前字尾的最長長度 第二個就是ab 第三就是 aba 第四個是 abab 第五個是 ababa 就這樣就算下去

*/ next :=

computenext

(needle)

q :=

0// 遍歷字串開始進行匹配

for i :=

0; i < n; i++

// 如果發現字串匹配,那麼就匹配下一位

if haystack[i]

== needle[q]

// 如果發現q=m 就說明匹配完畢,我們這裡計算一下匹配的位置

if q == m

}return-1

}// 計算next的值

func

computenext

(pattern string)[

]int

// 開始計算

if pattern[k]

== pattern[q]

// 直接把第q為的值賦值進去

next[q]

= k }

return next

}

字串的排列(雙指標)

先給題 給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 示例2 輸入 s1 ab s2 eidboaoo 輸出 ...

字串匹配之KMP實現

kmp演算法看懂了覺得特別簡單,思路很簡單,看不懂之前,查各種資料,看的稀里糊塗,即使網上最簡單的解釋,依然看的稀里糊塗。kmp演算法充分利用了目標字串ptr的性質 比如裡面部分字串的重複性,即使不存在重複字段,在比較時,實現最大的移動量 kmp演算法主要是next陣列的計算 分析 include ...

kmp字串匹配

首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...