主要參考:
理解kmp 的9張ppt:假設模式串為p,原串為s
1 樸素方法
最壞時間複雜度:o(p.length*s.length)
2 kmp
時間複雜度:o(p.length+s.length)
kmp演算法步驟:
1.構造next陣列
2.將模式串和原串進行匹配
3 kmp相關練習
3道都是模板題,大差不差,主要在於鞏固,加深記憶。
演算法練習1 #1015 : kmp演算法
#include #include using namespace std;
#define maxn 10005
int next1[maxn];
//得到next1陣列 next1[j]表示字元子串(0~j)中字首字尾相等的最長字元個數(-1表示0個字元相等,0表示有1個字元相等,以此類推)
void getnext(string s1)
if(s1[j] == s1[t + 1])
else}/*
cout
string s1, s2;
while(t--)
if(s2[t + 1] == s2[j])
else
}int i=0, j=0;
while(i < len1)
if(p[t + 1] == p[j])
else
}}int kmp(string p, string s)
} else
else
}} return cnt;
}int main()
return 0;
}
字元匹配kmp演算法
前言 之前對kmp演算法雖然了解它的原理,即求出p0 pi的最大相同前字尾長度k 但是問題在於如何求出這個最大前字尾長度呢?我覺得網上很多帖子都說的不是很清楚,總感覺沒有把那層紙戳破,後來翻看演算法導論,32章 字串匹配雖然講到 了對前1.kmp演算法的原理 本部分內容 字串匹配是計算機的基本任務之...
字元匹配 KMP演算法
problem description 給定兩個字串string1和string2,判斷string2是否為string1的子串。input 輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長度小於1000000 string1和s...
KMP字元匹配演算法原理
掘金位址鏈結 簡介 kmp演算法是一種改進的字元匹配演算法。由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 它的核心思想是,通過乙個next陣列,在匹配失敗後,減少字元移動的距離,達到快速匹配的目的。要想徹底理解kmp...