Algorithm Gossip (11) KMP字符串匹配

跳轉

字符串匹配: 跳轉到個人博文
KMP算法 實現字符串匹配 python

http://blog.csdn.net/actanble/article/details/53024717算法

前言

This Series aritcles are all based on the book 《經典算法大全》; 對於該書的全部案例進行一個探究和拓展,而且用python和C++進行實現; 目的是熟悉經常使用算法過程當中的技巧和邏輯拓展。markdown

提出問題

Algorithm Gossip: 字串覈對
字符串匹配: 跳轉到個人博文 KMP算法 實現 字符串匹配http://blog.csdn.net/actanble/article/details/53024717ui

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void table(char*);// 創建前進表
int search(int,char*, char*);// 搜尋關鍵字
void substring(char*,char*,int,int);// 取出子字串
int skip[256];
int main(void) {
    char str_input[80];
    char str_key[80];
    char tmp[80] = {'\0'};
    int m, n, p;
    printf("請輸入字串:");
    gets(str_input);
    printf("請輸入搜尋關鍵字:");
    gets(str_key);
    m = strlen(str_input);// 計算字串長度
    n = strlen(str_key);
    table(str_key);
    p = search(n-1,str_input,str_key);
    while(p != -1) {
        substring(str_input,tmp, p, m);
        printf("%s\n", tmp);
        p = search(p+n+1,str_input,str_key);
    }
    printf("\n");
    return 0;
}

void table(char *key) {
    int k, n;
    n = strlen(key);
    for(k = 0; k <= 255;k++)
        skip[k] = n;
    for(k = 0; k < n - 1; k++)
        skip[key[k]] = n - k - 1;
}

int search(int p, char* input,char* key) {
    int i, m, n;
    char tmp[80] = {'\0'};
    m = strlen(input);
    n = strlen(key);
    while(p < m) {
        substring(input,tmp, p-n+1,p);
        if(!strcmp(tmp, key)) // 比較兩字串是否相同
            return p-n+1;
        p += skip[input[p]];
    }
    return -1;
}
void substring(char *text,char* tmp, int s, int e) {
    int i, j;
    for(i = s, j = 0; i <= e; i++, j++)
        mp[j] = text[i];
    tmp[j] = '\0';
}

分析和解釋

代碼

拓展和關聯

後記

參考書籍

  • 《經典算法大全》
  • 維基百科
相關文章
相關標籤/搜索