KMP算法C++实现

#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");
}

猜你喜欢

转载自blog.csdn.net/u010859498/article/details/81458554