显示KMP计算前缀功能的结果

时间:2016-08-26 16:31:07

标签: c#

我正在尝试为学校解决作业,它涉及KMP算法。这是我的计算前缀函数,它假设输出一个前缀表,但它所做的就是每次返回所有0。可以帮我理解我做错了什么?谢谢!

static int[] computePrefixFunction(string P)
        {
            int m = P.Length;
            int[] pi = new int[m];
            pi[1] = 0;
            int k = 0;

            for (int j = 2; j < m; j++)
            {
                while (k > 0 && P[k + 1] != P[j])
                {
                    k = pi[k];
                }
                if (P[k+1] == P[j])
                { k = k + 1; };
                pi[j] = k;
            }

            for (int i = 0; i < pi.Length; i++)
            {
                Console.WriteLine(pi[i]); 
            }
            return pi;
        }

1 个答案:

答案 0 :(得分:1)

你搞砸了索引偏移。这是固定版本:

static int[] computePrefixFunction(string P)
{
    int m = P.Length;
    int[] pi = new int[m];
    int k = 0;

    for (int j = 1; j < m; j++)
    {
        k = pi[j - 1];

        while (k > 0 && P[k] != P[j])
            k = pi[k-1];

        if (P[k] == P[j])
            k = k + 1; 

        pi[j] = k;
    }

    return pi;
}

现场演示:https://dotnetfiddle.net/YQknMp