【问题标题】:Knuth Morris Pratt algorithm implementationKnuth Morris Pratt 算法实现
【发布时间】:2017-04-02 01:55:32
【问题描述】:

我正在尝试实现 KMP 算法。部分“if (W[i] == S[m + i])”返回索引超出范围异常,我无法让它工作。

我在维基百科上关注示例:https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

static int[] KMPTable(string W)
    {
        int[] T = new int[W.Length];
        int pos = 2;
        int cnd = 0;

        T[0] = -1;
        T[1] = 0;

        while (pos < W.Length)
        {
            if (W[pos - 1] == W[cnd])
            {
                T[pos] = cnd + 1;
                cnd = cnd + 1;
                pos = pos + 1;
            }
            else
                if (cnd > 0)
                {
                    cnd = T[cnd];
                }
                else
                {
                    T[pos] = 0;
                    pos = pos + 1;
                }
        }

        return T;
    }

    static int[] KMPSearch(string S, string W)
    {
        int m = 0;
        int i = 0;
        int[] kmpNext = KMPTable(S);
        List<int> result = new List<int>();

        while (m + i < S.Length)
        {
            if (W[i] == S[m + i])
            {
                if (i == W.Length - 1)
                {
                    result.Add(m);
                }
                    i = i + 1;
            }
            else
            {
                m = m + i - kmpNext[i];
                if (kmpNext[i] > -1)
                    i = kmpNext[i];
                else
                    i = 0;
            }
        }
        return result.ToArray();
    }

【问题讨论】:

  • 我建议您检查 if 语句之前的值。这将使您知道 W.length、S.length、i 和 m 的值是什么。您将能够看到正在发生的事情以及需要更改算法的地方。

标签: c# algorithm


【解决方案1】:

当 m + i

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2014-05-01
    • 2014-11-26
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多