給小白看的KMP演算法

2022-02-04 20:10:58 字數 1277 閱讀 5224

**kmp演算法:

(大部分人的kmp寫法都是不一樣的)

一:先給大家推薦乙個講kmp比較好理解的乙個部落格:阮一峰

二:栗子:

p串: abcbd

字首:a,ab,abc,abcb,abcbd 

真字首:a,ab,abc,abcb 

字尾:d,bd,cbd,bcbd,abcbd 

真字尾:d,bd,cbd,bcbd

kmp演算法裡的next陣列的含義:

栗子:p串: abcdabd 

next = ; 

next[i] 的含義:p串前 i 個字元(包括第 i 個)的最長真字首字尾公共長度;     

如 i = 5時: 

真字首:a,ab,abc,abcd 

真字尾:bcda,cda,da,a

顯而易見, 字首和字尾相同的只有 a,而 a 的長度為 1,所以next[5] = 1;

//

用通俗的語句說就是k是用來表示子串中前k個和後k個是相同的,i是用來遍歷陣列

void get_next(char *t,int

lent)

else k =nex[k];

/*如果c[i]和c[k]中字元不同說明匹配是失敗,要把k的值重新退到next[ k ]

直到兩者相同才停止。這樣做的好處是沒必要再重新從頭再來,節約時間*/}

}

//

返回主串中匹配的位置(第乙個),如果不匹配返回-1;

intkmp(char *s,char *t,int lens,int lent)

}else j=nex[j];

}return -1

;}

幾道例題:

洛谷p3375:

#include#include

using

namespace

std;

const

int maxn = 1e6 + 10

;int

nex[maxn];

char

s[maxn],t[maxn];

intlens,lent;

void

get_next()

else k =nex[k];

}}

void

kmp()

}else j=nex[j];

}}int

main()

}return0;

}

view code

演算法小白KMP入門(捂臉)

先放題吧.給定乙個字串 模式串 和一些待查詢的字串,求每個待查詢字串在模式串中出現的次數 可重疊 測試資料有多組 測試組數 5 第一行包括乙個字串p,長度不超過105,且非空串 第二行包括乙個整數n,代表待查詢的字串數量 1 n 5 接下來的n行,每一行包括乙個待查詢的字串,其長度不超過50,且非空...

讓內網穿透變的更簡單,小白看了直呼內行!!!

原生外掛程式中,有乙個比較有趣的功能,內網穿透。內網穿透能讓沒有公網 ip 的使用者獲得與公網 ip 使用者相同的權利。比如檔案分享 http 服務共享等等。最常見的應用 將家中電腦的某個資料夾分享出來,在外出的時候可以隨時連回家獲取檔案。utools 的內網穿透有三種模式 http 服務要求你在電...

KMP演算法詳解 適合初學KMP演算法的朋友

相信很多人 包括自己 初識kmp演算法的時候始終是丈二和尚摸不著頭腦,要麼完全不知所云,要麼看不懂書上的解釋,要麼自己覺得好像心裡了解kmp演算法的意思,卻說不出個究竟,所謂知其然不知其所以然是也。經過七八個小時地仔細研究,終於感覺自己能說出其所以然了,又覺得資料結構書上寫得過於簡潔,不易於初學者接...