字串匹配問題 KMP BF

2021-09-23 10:39:39 字數 1955 閱讀 5105

bf演算法實現:複雜度o(m*n)

//在str的pos下標開始,判斷是否包含sub字串,包含則返回第一次匹配成功的開始下標

int bf(const char *str, const char *sub, int pos)

else //此處沒匹配上

}if (j == lensub) //上述if中,j++後,如果j==lensub則退出迴圈,且保證將子串全部匹配到

return i - j; //i減去增量j就是其開始位置

else

return -1;

}

kmp演算法:複雜度o(m+n)

分析:kmp演算法的特點:  主串位置 i不回退,但是子串 j 回退到該回退到的位置

發生匹配失效後,在之前匹配成功的子串中找到兩個最長的相等的真子串,兩個真子串有如下兩個特點:(1) 乙個子串以0下標為開始; (2) 另乙個下標以失配前的最後乙個字元為結尾失配時如圖:

4.用一次kmp演算法後變化如圖:

5. kmp演算法的證明:

6.  手動求解子串對應的next陣列

7. 程式中求解next陣列的分析:

kmp**實現:

static int *getnext(const char *sub)//此方法不是最優的,其中包括一些無效的回退

else //s[j+1]!=p[k+1] --> k=next[k]

}return next;

}//kmp演算法的特點:主串位置 i回退,但是子串 j回退到該回退到的位置

int kmp(const char *str, const char *sub, int pos)

else //此處沒匹配上

}delete next;

if (j == lensub) //上述if中,j++後,如果j==lensub則退出迴圈,且保證將子串全部匹配到

return i - j; //i減去增量j就是其開始位置

else

return -1;

}

上述實現有乙個問題:假設模式串中q號位置失配了,那麼我們下一次要跳轉到next[q-1]號位置進行匹配,但是如果sub[q]==sub[next[q-1]]的話,那麼我們這一次的匹配還是失敗的,我們需要繼續我們的next迭代過程,直到找到開始匹配的為止。

優化後**如下:

static int *getnextval(const char *sub)

else //此處沒匹配上

}delete next;

if (j == lensub) //上述if中,j++後,如果j==lensub則退出迴圈,且保證將子串全部匹配到

return i - j; //i減去增量j就是其開始位置

else

return -1;

}

字串匹配(KMP BF)

字串匹配 題目描述 設計乙個程式,從乙個主字串中查詢乙個子字串在主串中第一次出現的位置。主串和子串的長度不超過100。如果找不到,則輸出 1.程式輸入說明 第一行輸入乙個整數n,說明需要進行匹配的例項數。第二行輸入第一組需要進行匹配的主串 第三行輸入第一組需要匹配的子字串。以下各行按照上面兩行的格式...

字串匹配問題

在字串匹配問題中,我們期待察看串t中是否含有串p。其中串t被稱為目標串,串s被稱為模式串。進行字串匹配,最簡單的乙個想法是 public class match 可以看見,這個演算法 假定m n 的複雜度是o mn 其中m是t的長度,n是p的長度。這種演算法的缺陷是匹配過程中帶有回溯 準確地說是t串...

字串匹配問題

給出乙個字串和多行文字,在這些文字中找到字串出現的那些行。你的程式還需支援大小寫敏感選項 當選項開啟時,表示同乙個字母的大寫和小寫看作不同的字元 當選項關閉時,表示同乙個字母的大寫和小寫看作相同的字元。輸入輸入的第一行包含乙個字串s,由大小寫英文本母組成。第二行包含乙個數字,表示大小寫敏感的選項,當...