KMP(持續(xù)理解中...)

static void Main()
{
    Console.WriteLine(KMP("1111ababacae22", "ababacae"));
    Console.ReadLine();
}

static int KMP(String s, String t)
{
    int[] next=new int[t.Length];
    int i = 0; 
    int j = 0;
    Getnext(next,t);
    while (i < s.Length && j < t.Length)
    {
        if (j == -1 || s[i] == t[j])
        {
            i++;
            j++;
        }
        else j = next[j];   // j = next[j]。此舉意味著失配時,接下來模式串 t 要相對于主串S向右移動j - next [j] 位   ①        
    }
    if (j >= t.Length)
        return (i - t.Length);         //匹配成功,返回子串的位置
    else
        return (-1);                  //沒找到
}

// 生成最長前后綴數(shù)組
// ababacae
// -1, 0, 0, 1, 2, 3, 0, 1
static void Getnext(int[] next, String t)
{
    int j = 0;
    int k = -1;
    next[0] = -1;

    while (j < t.Length - 1)
    {
        if (k == -1 || t[j] == t[k])
        {
            j++; 
            k++;
            next[j] = k;
        }
        else
        {
            // 當(dāng)前模式串 k 位置,已經(jīng)不匹配。但 k 位置之前的子字符串中存在 next[k] 個最長前后綴。
            // 因此,將 k 回溯到 next[k] 處 ②
            k = next[k];  
        }
    }
}

① 的理解
可以理解為:模式串 t 的 k 位置要與主串 s 的 j 位置對齊,用于比較


image.png

=>

image.png

②的理解


image.png

參考文檔
https://blog.csdn.net/yyzsir/article/details/89462339

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容