十分好玩比較的函式kmp注釋
如果有乙個題目,說明的是在乙個母串之中找到乙個字串s出現了幾次的時候,問你輸出次數?
無需介紹吧!1.暴力,列舉每個位置 時間複雜度 o(n*m)
2.使用kmp 時間複雜度 o(m+n)
直接上演算法!
先上演算法,之後再來講解,呵呵!#include
using
namespace
std;
int main()
printf("%d\n",ans);
return
0;}
對於乙個字串的匹配,如果找的了no.i的位置無法匹配,我們通常會開始繼續匹配,但是比如abababa,後來又來了ababca,很明顯,在s的char c位置出現了不夠匹配,但是,如果是暴力的話就是之後繼續判斷,但是可以相處乙個使得最大的字首和等於字尾和的是將,儲存在花掉匹配的i點記為p[i]就好了!,可能不會動,但是就附上吧!#include
#include
#include
#include
using
namespace
std;
const
int n=100005;
int p[n];
char s[n],t[n*10];
void getp(int n)
p[i]=++j;
}}int kmp(int n,int m)
j++;//ºóé¨ò»î»!!
if(j==n)
}return ret;
}int main()
}
那麼這麼預處理呢?
就是這個函式:
p[0]此時的作用只是為了輔助p[1~len]的促成罷了,但是j=-1的初始化真的要好好的去理解啊!while迴圈的跳出條件就是void getp(int n)
p[i]=++j;}}
while(j>=0&&s[j+1]!=s[i])
那麼為什麼是這兩個資料呢
1.j>=0,就是說萬一根本沒有最長字首的事情,所以就跳出來,恰是-1,然後j++,就片尾了0,再賦值,之後就會使得i+1的位置是帶著p[i]=0,的情況下去去搜尋,去預處理,是不是很妙?
2.這是因為這個圖!
所以是while (s[i]!=s[j+1])
只要還是注釋帶」*」號的地方,就是將來說如果匹配成功的話就繼續匹配,在p[j]的位置上下去就好了!,但是有一些題目j=0,為什麼?比如int kmp(int n,int m)
j++;
if(j==n)
}return ret;
}
剪花布條
因為這個題目是減下來的,也就是說剪掉就沒了!
注: 之後還有更多好玩的kmp玄學問題,暫等更新……
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 翻...
字串匹配 KMP
參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...
KMP字串匹配
判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...