字符串匹配之KMP算法
2013-09-16 09:02
344 查看
阮一峰的博客
#include<stdio.h> #include<string.h> #include<stdlib.h> void computeLPSArray(char *pat, int M, int *lps); void KMPSearch(char *pat, char *txt) { int M = strlen(pat); int N = strlen(txt); // create lps[] that will hold the longest prefix suffix values for pattern int *lps = (int *)malloc(sizeof(int)*M); int j = 0; // index for pat[] // Preprocess the pattern (calculate lps[] array) computeLPSArray(pat, M, lps); int i = 0; // index for txt[] while(i < N) { if(pat[j] == txt[i]) { j++; i++; } if (j == M) { printf("Found pattern at index %d \n", i-j); j = lps[j-1]; } // mismatch after j matches else if(pat[j] != txt[i]) { // Do not match lps[0..lps[j-1]] characters, // they will match anyway if(j != 0) j = lps[j-1]; else i = i+1; } } free(lps); // to avoid memory leak } void computeLPSArray(char *pat, int M, int *lps) { int len = 0; // lenght of the previous longest prefix suffix int i; lps[0] = 0; // 一个字符的前缀和后缀都为空集,共有元素的长度为0 i = 1; // the loop calculates lps[i] for i = 1 to M-1 while(i < M) { if(pat[i] == pat[len]) { len++; lps[i] = len; i++; } else // (pat[i] != pat[len]) { if( len != 0 ) { // This is tricky. Consider the example AAACAAAA and i = 7. len = lps[len-1]; // Also, note that we do not increment i here } else // if (len == 0) { lps[i] = 0; i++; } } } } int main() { char *txt = "BBC ABCDAB ABCDABCDABDE"; char *pat = "ABCDABD"; KMPSearch(pat, txt); getchar(); return 0; }
相关文章推荐
- KMP算法:字符串匹配
- 字符串匹配的KMP算法
- 字符串匹配的KMP算法原理——16张图片看完就懂了
- 字符串匹配KMP算法
- 字符串匹配的KMP算法(部分匹配表:前缀---后缀)
- 【算法】字符串匹配的KMP算法
- 字符串匹配的KMP算法
- 字符串匹配 - KMP算法
- 字符串匹配的KMP算法(2)
- 字符串匹配KMP算法
- 算法 字符串匹配之朴素算法和KMP算法及JAVA代码实现
- 字符串匹配算法(二)-KMP算法
- KMP算法及字符串匹配学习
- 字符串匹配的KMP算法
- KMP算法 --字符串匹配
- 字符串匹配的KMP算法
- kmp算法(用来处理字符串匹配)
- 字符串匹配的KMP算法(转)
- 字符串匹配的KMP算法
- 透彻理解KMP算法 - 字符串匹配/子串查找