字串基礎演算法之 ex kmp

2021-09-24 17:19:33 字數 1402 閱讀 1385

因為自己是個菜b所以老實點複習演算法

假設兩個字串s1,

s2

s1,s2

s1,s2.

需要找出s2s2

s2在s 1s1

s1**現次數(包含0次).

n ex

ti

next_i

nexti​

:在s

21..

is2_

s21..i

​中最長公共字首字尾的長度.

(因為我懶得貼圖所以只會口胡)

(貼個不錯的部落格忘記了就看這個)

首先逐位匹配,如果遇到不匹配的,按照平時的匹配規律,我們應該是往後移一位然後重複匹配過程.

但是k mp

kmpkm

p演算法的優越之處就在於,它可以利用nex

tnext

next

陣列效率更高的往後跳轉.

假設當前s

21..

js2_

s21..j

​均匹配,跳轉方式為向後跳j−n

ext[

j]

j-next[j]

j−next

[j]位.

原因:前文提到nex

tnext

next

陣列的定義為最長公共字首字尾,所以跳轉j−n

ext[

j]

j-next[j]

j−next

[j]位就確保了前面的nex

t[j]

next[j]

next[j

]位仍然是匹配的,這就加快了匹配效率.

個人認為還是相當好理解.

其實跟上面的匹配過程同理.

設k

kk表示s

21..

ks2_

s21..k

​和s2i−

k..i

s2_s2

i−k.

.i​相等.

若s 2k

+1

s2_k+1

s2k​+1

相等s 2i

+1

s2_i+1

s2i​+1

,則k ++

k++k+

+.否則利用nex

tnext

next

陣列的性質,k=n

ext[

k]

k=next[k]

k=next

[k]往前跳直至s2k

+1==

s2i+

1s2_k+1 == s2_i+1

s2k​+1

==s2

i​+1

.

演算法之字串字元統計

分析和思路 用map建立字元對映,並賦值到pair結構裡,然後用vector的sort 優先順序排序 1 此檔案包含 main 函式。程式執行將在此處開始並結束。2 34 include 5 include 6 include algorithm 7 include 8 include 9 usin...

python基礎之字串

1.單引號字串和轉義引號 在python中,字串是用單引號或者雙引號括起來,在表示字串的時候,單引號和雙引號有什麼區別嗎?事實上並沒有。在某些特殊情況時候,單引號和雙引號是不能換線交換的,比如在乙個字串中包含了雙引號,那麼這個字串就必須用單引號括起來,反之,乙個字串中包含了單引號,那麼這個字串就必須...

python基礎之字串

1.基本字串的操作 所有標準序列的操作 索引,分片,乘法,成員資格判斷,求長度,取最小和最大值 同樣適用,但是記住 字串都是不可變的。2.字串格式化 精簡版 字串的格式化可以使用字串格式化操作符 百分號 來實現。在 的左側放置乙個字串 格式化字串 而右側放置希望被格式化的值。可以使用乙個值,如乙個字...