KMP模式匹配算法實現與改進

openkk 13年前發布 | 1K 次閱讀 Mageia 4

/KMP模式匹配算法實現/
//通過計算返回子串T的next數組
void get_next(String T,int * next)
{
    int i,j;
    i = 1;
    j = 0;
    next[1] = 0;
    while (i < T[o]) //T[0]表示串T的長度
    {
        if (j == 0 || T[i] == T[j]) //T[i]表后綴的單個字符,T[j]表前綴的單個字符
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
            j = next[j];    //若字符不相同,則j值回溯
    }
}

//返回子串T在主串S中的pos個字符之后的位置。若不存在返回值0 int Index_KMP(String S,String T,int pos) { int i = pos; int j = 1; int next[255]; //定義一個next數組 get_next(T,next); //對串T作分析,得到next數組 while (i <= S[0] && j<= T[0]) //S[0]和T[0]為主串個子串的長度 { if (j == 0 || S[i] == T[j]) { ++i; ++j;
} else { j = next[j]; //j退回合適的位置,i值不變 } } if (j > T[0]) return i-T[0]; else return 0; }</pre>

/*KMP模式匹配算法的改進*/
//通過計算返回子串T的nextval數組
void get_nextval(String T,int * nextval)
{
    int i,j;
    i = 1;
    j = 0;
    nextval[1] = 0;
    while (i < T[0]) //T[0]表示串T的長度
    {
        if (j == 0 || T[i] == T[j]) //T[i]表后綴的單個字符,T[j]表前綴的單個字符
        {
            ++i;
            ++j;
            if (T[i] != T[j])   //若當前字符與前綴字符不同
                nextval[i] = j; //則當前的j為nextval在i位置的值
            else
                nextval[i] = nextval[j];    //如果字符相同,則將前綴字符的nextval值賦給nextval在i位置的值
        }
        else
            j = nextval[j]; //若字符不相同,則j值回溯
    }
}
轉自:http://blog.csdn.net/hacke2/article/details/7295628&nbsp;

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!