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