1. 程式人生 > 實用技巧 >KMP子串查詢演算法

KMP子串查詢演算法

問題:如何在目標字串S中,查詢是否存在子串P?

樸素解法:
int sub_str_index(const char* s, const char* p)
{
    int ret = -1;
    int sl = strlen(s);
    int pl = strlen(p);
    int len = sl - pl;
    
    for(int i=0; (ret<0)&&(i<=len); i++)
    {
        bool equal = true;
        
        for(int j=0; equal && (j<Pl); j++)
            equal 
= equal && (s[i + j] == p[j]); ret = (equal ? i : -1); } return ret; }
樸素的解法是有問題的,
假設目標字串是a b c d e
子串是          a b c z
p字串中前三個字元比對都成功了,但是到了第4個字元,比對失敗了。這個時候如果以樸素的解法應該如何做呢?
p字串右移1個字元,繼續比對。這樣做雖然可以但是效率太低了,也沒有意義,分析如下:
因為pa != pb 且pb == sb;
所以pa != sb,
因此,子串p右移1位比較,沒有意義

部分匹配表是如何得到的?

將中間的字首、字尾、交集這幾列去掉,得到的就是部分匹配表了

怎麼程式設計產生部分匹配表?

部分匹配表的遞推與實現

樸素的解法是有問題的,假設目標字串是a b c d e子串是 a b c zp字串中前三個字元比對都成功了,但是到了第4個字元,比對失敗了。這個時候如果以樸素的解法應該如何做呢?p字串右移1個字元,繼續比對。這樣做雖然可以但是效率太低了,也沒有意義,分析如下:因為pa != pb 且pb == sb;所以pa != sb,因此,子串p右移1位比較,沒有意義