exkmp學習小結

2021-08-25 02:51:34 字數 1145 閱讀 9514

首先,我們定義乙個next[1...m]陣列表示模板串t從第i位開始與自身的最長公共字首。假設next[i]=ai,那麼t[1~ai-1]與t[i~i+ai-1]是匹配的。

如何去求next陣列呢?

假設我們已知next[1~i-1],現在求next[i]。我們在next[1~i-1]中記錄乙個p表示之前最長延伸到的位置,並把p的座標記錄id。也就是說next[id]=p(1<=id<=i-1)且p為next[1~i-1]的最大值。那麼如果p>i,t[i~p]和t[i-id+1~p-id+1]匹配。那麼next[i]>=next[i-id+1]。

現在分兩種情況討論,我們設j=next[i-id+1].

第一種i+j<=p,則next[i]=next[i-id+1]。

因為next[i-id+1]最多匹配到i-id+1+j-1也就是說t[i-id+1+j]與t[j+1]不匹配。同樣,因為t[id~p]與t[1~next[id]]匹配,所以t[i+j]與t[j]

不匹配。則next[i]=next[i-id+1]。

第二種i+j>p(也就是i+j-1>=p)

如果i+j-1>p毫無疑問我們不能確定next[i]=next[i-id+1],所以我們暴力判斷後面是否匹配,並更新next[i]。

那如果i+j-1=p呢,非常蠢的我想了很久才發現這也是要判斷是否匹配的。由於t[i-id+1+j]與t[j+1]不匹配,所以next[i-id+1]=j,但我們不能確定t[i+j]不與t[j+1]不匹配,因為i+j已經超過p了。

和kmp一樣,我們可以用同樣的方法求ext陣列,方法都基本一樣的。

#include#include#includeusing namespace std;

#define n 10000

int next[n],ext[n],n,m,p,id;

char s[n],t[n];

int main()

id=p=0;

for(int i=1;i<=n;i++)

for(int i=1;i<=m;i++)

printf("%d ",next[i]);

printf("\n");

for(int i=1;i<=n;i++)

printf("%d ",ext[i]);

}

字串基礎演算法之 ex kmp

因為自己是個菜b所以老實點複習演算法 假設兩個字串s1,s2 s1,s2 s1,s2.需要找出s2s2 s2在s 1s1 s1 現次數 包含0次 n ex ti next i nexti 在s 21.is2 s21.i 中最長公共字首字尾的長度.因為我懶得貼圖所以只會口胡 貼個不錯的部落格忘記了就看...

面試小結 學習小結

1 string 字串常量,每次改變都會生成乙個新的物件 stringbuffer 執行緒安全 變數 改變不會生成乙個新的物件 stringbuilder 非執行緒安全 在非多執行緒的情況下,用stringbuilder會快些 2 activity的四種啟動模式 singletop 棧頂正好是該ac...

python小結教學 python學習小結

python具有非常豐富的資料型別,包括字串,列表,元組,字典集合等,每種資料型別的特點都大一樣,好好利用他們 可以讓你的python程式設計變的非常輕鬆,要好好利用就應該充分了解他們的特點,下面對他們的特點進行一些總結。python字串 字串在python中是乙個單個字元的字串的序列,可以對字串進...