KMP子串查詢演算法
阿新 • • 發佈:2020-07-16
問題:如何在目標字串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位比較,沒有意義