1. 程式人生 > >演算法4-6:KMP字串模式匹配演算法實現 (c語言)

演算法4-6:KMP字串模式匹配演算法實現 (c語言)

[提交] [統計] [提問]

題目描述

KMP演算法是字串模式匹配演算法中較為高效的演算法之一,其在某次子串匹配母串失敗時並未回溯母串的指標而是將子串的指標移動到相應的位置。嚴蔚敏老師的書中詳細描述了KMP演算法,同時前面的例子中也描述了子串移動位置的陣列實現的演算法。前面你已經實現了子串移動的陣列,現在就來利用該陣列來實現KMP模式匹配。

下面是相應的演算法:

圖:KMP演算法

輸入描述

3組字串,每組字串佔一行。每行包含由空格分隔的兩個字串,字串僅由英文小寫字母組成且長度不大於100。

輸出描述

每組資料輸出1行,輸出後一個字串在前一個字串中的位置,如果不匹配,則輸出0。

輸入樣例
string str
thisisalongstring isa
nosubstring subt

輸出樣例
1
5
0

提示

提示:
表示字串的資料結構依然是字元陣列。
總結:
KMP演算法呼叫很簡單,但難的是理解演算法的思想。掌握演算法的思想才能說是掌握演算法。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char a[105];
char b[105];
char next[105];
int h1, h2;

void get_Next()
{
        int i;
        int h = strlen(a);
        next[0] = -1;
        int j = -1;
        for(i = 1; i < h; i++)
        {
            while(j != -1 && a[i] != a[j+1])
            {
                j = next[j];
            }
            if(a[i] == a[j+1])
            {
                j++;
            }
            if(j == -1 || a[i+1] != a[j+1])
            {
                next[i] = j;
            }
            else
            {
                next[i] = next[j];
            }

        }
}

int KMP()
{
    int i;
    int j = -1;
    get_Next();
    for(i = 0; i < h2; i++)
    {
        while(j != -1 && b[i] != a[j+1])
        {
            j = next[j];
        }
        if(b[i] == a[j+1])
        {
            j++;
        }
        if(j == h1-1)
        {
            return i+1-h1;
        }
    }
    return -1;

}

int main()
{
    int  i, j, x, k = 3;
    while(k--)
    {
        scanf("%s %s", b, a);
        h1 = strlen(a);
        h2 = strlen(b);
        x = KMP();
        printf("%d\n", x+1);
    }
    return 0;
}