目錄
簡單介紹該函數(shù)的作用
? ? ? ? 在我們?nèi)ビ藐P(guān)鍵詞查找微信或者qq聊天記錄的時候,我們總不能一句一句去找吧。我們需要用到的功能底層大概是此博客所講的這個函數(shù)熬。
一.算法需要傳入的參數(shù)和返回類型
? ? ? ? 需要傳入的就是關(guān)鍵詞和所有的文本,返回的是當(dāng)前關(guān)鍵詞出現(xiàn)的首個位置。
二.字符串匹配的方法(KMP算法)
? ? ? ? 在查找字符串的時候,有時不需要每次都從頭再來。我們偶爾需要抄抄近路,從當(dāng)前已知的結(jié)果提取信息。所以,我們的next[]數(shù)組出現(xiàn)了。
? ? ? ? 那什么是KMP呢?
????????????????這三位學(xué)者發(fā)明的:Knuth,Morris和Pratt,所以取了三位學(xué)者名字的首字母。所以叫做KMP。
? ? ? ? 那什么是next[]呢(回退表)?
????????????????前綴表是用來回退的,它記錄了模式串與主串(文本串)不匹配的時候,模式串應(yīng)該從哪里開始重新匹配。
? ? ? ? 那一個前綴表是如何記錄我們要跳到哪個位置去的呢?
????????????????前綴表的任務(wù)是當(dāng)前位置匹配失敗,找到之前已經(jīng)匹配上的位置,再重新匹配,此也意味著在某個字符失配時,前綴表會告訴你下一步匹配中,模式串應(yīng)該跳到哪個位置。
三.算法的實現(xiàn)
? ? ? ? 1.前綴表的實現(xiàn):? ? ? ? ??
????????2.核心代碼
四.生成前綴表的筆者自己理解的方法
? ? ? ? 就是尋找在當(dāng)前字符是否是與原字符串起始位置相同,如果是相同的那就是1,但如果該字符左側(cè)就是已經(jīng)匹配過的片段,那直接加1后判斷下一個字符,比如下面的next[]文章來源:http://www.zghlxwxcb.cn/news/detail-659752.html
簡單介紹該函數(shù)的作用
? ? ? ? 在我們?nèi)ビ藐P(guān)鍵詞查找微信或者qq聊天記錄的時候,我們總不能一句一句去找吧。我們需要用到的功能底層大概是此博客所講的這個函數(shù)熬。
一.算法需要傳入的參數(shù)和返回類型
? ? ? ? 需要傳入的就是關(guān)鍵詞和所有的文本,返回的是當(dāng)前關(guān)鍵詞出現(xiàn)的首個位置。
二.字符串匹配的方法(KMP算法)
? ? ? ? 在查找字符串的時候,有時不需要每次都從頭再來。我們偶爾需要抄抄近路,從當(dāng)前已知的結(jié)果提取信息。所以,我們的next[]數(shù)組出現(xiàn)了。
? ? ? ? 那什么是KMP呢?
????????????????這三位學(xué)者發(fā)明的:Knuth,Morris和Pratt,所以取了三位學(xué)者名字的首字母。所以叫做KMP。
? ? ? ? 那什么是next[]呢(回退表)?
????????????????前綴表是用來回退的,它記錄了模式串與主串(文本串)不匹配的時候,模式串應(yīng)該從哪里開始重新匹配。
? ? ? ? 那一個前綴表是如何記錄我們要跳到哪個位置去的呢?
????????????????前綴表的任務(wù)是當(dāng)前位置匹配失敗,找到之前已經(jīng)匹配上的位置,再重新匹配,此也意味著在某個字符失配時,前綴表會告訴你下一步匹配中,模式串應(yīng)該跳到哪個位置。
三.算法的實現(xiàn)
? ? ? ? 1.前綴表的實現(xiàn):? ? ? ? ??
void getNext(int* next, const string& s) {
int j = -1;
next[0] = j;
for(int i = 1; i < s.size(); i++) { // 注意i從1開始
while (j >= 0 && s[i] != s[j + 1]) { // 前后綴不相同了
j = next[j]; // 向前回退
}
if (s[i] == s[j + 1]) { // 找到相同的前后綴
j++;
}
next[i] = j; // 將j(前綴的長度)賦給next[i]
}
}
????????2.核心代碼
int strStr(string haystack, string needle) {
if (needle.size() == 0) {
return 0;
}
int next[needle.size()];
getNext(next, needle);
int j = -1; // // 因為next數(shù)組里記錄的起始位置為-1
for (int i = 0; i < haystack.size(); i++) { // 注意i就從0開始
while(j >= 0 && haystack[i] != needle[j + 1]) { // 不匹配
j = next[j]; // j 尋找之前匹配的位置
}
if (haystack[i] == needle[j + 1]) { // 匹配,j和i同時向后移動
j++; // i的增加在for循環(huán)里
}
if (j == (needle.size() - 1) ) { // 文本串s里出現(xiàn)了模式串t
return (i - needle.size() + 1);
}
}
return -1;
}
四.生成前綴表的筆者自己理解的方法
? ? ? ? 就是尋找在當(dāng)前字符是否是與原字符串起始位置相同,如果是相同的那就是1,但如果該字符左側(cè)就是已經(jīng)匹配過的片段,那直接加1后判斷下一個字符,比如下面的next[]
文章來源地址http://www.zghlxwxcb.cn/news/detail-659752.html
到了這里,關(guān)于Leecode找出字符串中第一個匹配項的下標(biāo) 即實現(xiàn)strSTR()函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!