字串查詢演算法之(一)KMP演算法

2021-05-26 06:46:04 字數 1419 閱讀 9820

問題:查詢text中是否含有pattern字串,返回pattern在text中的位置。

#include #include using namespace std;

// init the prefix array. when comparing, if text[i] != pattern[j],

// then pattern[prefix[j]] should be next check point of pattern against text[i].

//// say y = prefix[j], y stands for the biggest length of the word pattern[0..(y-1)]

// that makes (pattern[0..(y-1)] == pattern[(j-y+1)..j]).

// in another word, y stand for the next comparation point of pattern.

// (y==0) means no such word, the next comparation should shart from pattern[0].

// note: it's possible that 00) && (pattern[i] != pattern[k]))

if (pattern[i] == pattern[k])

else

}return;

}int strstr(const char* text, const char* pattern)

int lentext = strlen(text);

int lenpattern = strlen(pattern);

if (lentext < lenpattern)

int *prefix = new int[lenpattern + 1];

initprefix(pattern, prefix); //the prefix array of pattern

int index = -1; // the index to be returned.

int i = 0; // the compare index in text.

int j = 0; // the compare index in pattern

while ((text[i] != '/0') && ((lentext - i) >= (lenpattern - j)))

// compare next char in pattern and text.

j++;

i++;

}else

else }}

delete prefix;

prefix=0;

return index;

}

KMP 演算法 字串查詢演算法

knuth morris pratt algorithm 克努斯 莫里斯 普拉特 演算法 克努斯 莫里斯 普拉特演算法 部分匹配表 字首 指除了最後乙個字元以外,乙個字串的全部頭部組合 字尾 指除了第乙個字元以外,乙個字串的全部尾部組合 部分匹配值 就是 字首 和 字尾 的最長的共有元素的長度。以 ...

字串查詢演算法kmp

字串查詢最簡單的方法就是乙個乙個地 滑動 查詢。這樣查詢演算法複雜度可定很高,假設pattern的長度為m,文字txt的長度為n,那麼演算法複雜度為o m n m 1 kmp模式搜尋演算法 kmp knuth morris pratt 我只認識knuth,大名鼎鼎的高納德老頭子嘛。kmp演算法的基本...

字串查詢演算法kmp

給定乙個文字串s,和乙個匹配串p,要求查詢p第一次在s中出現的位置。常見的方法如暴力搜素,逐個匹配s i p j 若匹配,下標後移。不匹配,i回溯到這次匹配前的下一位置,j置為0,重新匹配。最壞情況,時間複雜度o n m int violencesearch char s,char p else i...