luciferzf 发表于 2017-8-3 19:12:57

《数据结构和算法》——KMP算法实现

利用一个next数组存储匹配串每一个位置的回溯下标,当用匹配串与被匹配串进行逐个比较时,若出现匹配错误,可以利用next数组快速回溯。
next数组:当前缀和后缀一致时,记录一次下标;若不一致,固定后缀,回溯前缀直至最开始的下标0,记录下标1,表示需要从头开始匹配。利用next数组我们可以快速地根据匹配串中重复的部分减少匹配次数。
#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
using namespace std;

void GetNext(char T[], int next[])
{
        int i=1, j=0;
        next = 0;
        while (i < T)
        {
                if (0 == j || T == T)
                {
                        i++;
                        j++;
                        if (T == T)
                        {
                                next = next;
                        }
                        else
                        {
                                next = j;
                        }
                }
                else
                {
                        j = next;
                }

        }
}

void GetString(char str[])
{
        int i;
        char temp;
        scanf_s("%c", &temp);
        for (i = 1; temp != ' '&&temp != '\n'; i++)
        {
                str = temp;
                scanf_s("%c", &temp);
        }
        str = i - 1 ;
}

int KMP(char S[], char T[],int next[])
{
        int i=1,j=1;
        int flag = 0;
        while (i <= S )
        {
                if (j==0||S == T)
                {
                        i++;
                        j++;
                }
                else
                {
                        j = next;
                }
                if (j > T )
                {
                        flag = 1;
                        break;
                }
        }
        if (flag)return i;
        else return 0;
}


int main()
{
        char S, T ;
        int next;

        cout << "输入主串:";
        GetString(S);
        cout << "输入子串:";
        GetString(T);

        GetNext(T, next);

        int pos = KMP(S, T, next)-T;

        if (pos)cout << "YES,in the no." << pos << endl;
        else cout << "NO"<< endl;

        system("PAUSE");
}
页: [1]
查看完整版本: 《数据结构和算法》——KMP算法实现