#include<iostream> void preProcess(int *kmpNext, const char *pattern) { int j = -1; int i = 0; kmpNext[i] = j; int len = strlen(pattern); while(i<len) { while(j >=0 && pattern[i] != pattern[j]) j=kmpNext[j]; ++i;++j; kmpNext[i] = j; if (pattern[i] == pattern[j]) kmpNext[i] = kmpNext[j]; else kmpNext[i] = j; } return; } void match(const char *str, const char *pattern, const int *pre) { int m = 0; int i = 0; int len = strlen(str); while(m+i < len) { if(str[m+i] == pattern[i]) { i++; if(i == strlen(pattern)) { std::cout << "Match found at index: " << m << std::endl; } } else { m = m + i - pre[i]; if(i > 0) { i = pre[i]; } } } return; } void KMP() { char String [] = "abcabcabdewqabcabd"; char pattern [] = "abcabd"; int *pre = new int [strlen(pattern)+1]; memset(pre, 0, (strlen(pattern)+1) * sizeof(int)); /* Preprocess the table */ preProcess(pre, pattern); for(int i =0; i<strlen(pattern)+1; ++i) std::cout << pre[i] << " "; std::cout << std::endl; /* Match the string */ match(String, pattern, pre); delete pre; return; } int main() { KMP(); return 0; }
Thursday, December 18, 2008
KMP string matching
Labels:
Algorithms
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment