#include<iostream>
using namespace std;
//在一个文本串S内查找一个模式串P 的出现位置
/*
暴力搜索法
*/
int violentMatch(char* s, char* p) {
int s_len = strlen(s);
int p_len = strlen(p);
int i = 0, j = 0;
while (i < s_len && j < p_len) {
if (s[i] == p[j]) {
i++;
j++;
}
else {
i = i - (j - 1);
j = 0;
}
}
if (j == p_len) {
return i - j;
}
return -1;
}
/*
KMP算法
*/
void getNext(char* p, int* next) {
next[0] = -1;
int p_len = strlen(p);
int i = 0;
int j = -1;
while (i < p_len) {
if (j == -1 || p[i] == p[j]) {
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int KMPsearch(char* s, char* p) {
int s_len = strlen(s);
int p_len = strlen(p);
int * next = new int[p_len];
getNext(p, next);
int i = 0, j = 0;
while (i < s_len && j < p_len) {
if (j == -1 || s[i] == p[j]) {
i++;
j++;
}
else
j = next[j];
}
if (j == p_len) {
return i - j;
}
return -1;
}
int main() {
char s[] = "abcdabcdebcd";
char p[] = "dabc";
cout << KMPsearch(s, p) << endl;
system("PAUSE");
}
KMP算法C++实现
猜你喜欢
转载自blog.csdn.net/u010859498/article/details/81458554
今日推荐
周排行