kmp程序計算next和改進的next

#include <iostream>
#include<queue>
#include<stack>
using namespace std;
int next[100];
//1、val=-1;此時意味着主串和子串的下標都需要加1;
//2、val={0,1...k-1}中的任意值,k爲正在比較的第k個字符,也就是說當他們不相等時,需要回溯到val繼續比較;
void get_next(char *p,int n) {
    int i=0,k;
    k=next[0]=-1;//k表示當前i字符的next值,利用i求i+1的next
    while(i<n) {
        if(k==-1||p[i]==p[k]) {
            k++,i++;
            next[i]=k;//但是當i+1與他的next值對應的字符相等時,我們需要繼續改進next[i]=next[k];
        } else k=next[k];
    }
}
void get_nextval(char *p,int n) {
    int i=0,k;
    k=next[0]=-1;//k表示當前i字符的next值,利用i求i+1的next
    while(i<n) {
        if(k==-1||p[i]==p[k]) {
            k++,i++;
            if(p[i]==p[k]) next[i]=next[k];
            else next[i]=k;
        } else k=next[k];
    }
}

int main()
{
    char a[7]= {
        'm','a','m','a','m','m','i'
    };
    get_nextval(a,7);
    for(int i=0; i<7; i++)
        cout<<next[i]<<" ";
    cout<<endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章