Knuth-Morris-Pratt字符串搜索算法

时间:2015-04-03 21:26:49

标签: string-search knuth-morris-pratt

我正在使用最后一个函数制作一个KMP字符串搜索算法......除了我认为不匹配的时候,一切似乎都工作得很好?我没有通过一个名为testKMPNotThere的JUnit测试..并且它声明返回的列表在文本中找不到模式时应为空...

所以它应该返回一个[]的列表,但由于某种原因它返回[1]中的一个..我无法找出为什么它在找不到模式时添加1 ..

这是我的代码 -

public List<Integer> kmp(CharSequence pattern, CharSequence text) {
    if (pattern == null || pattern.length() == 0) {
        throw new IllegalArgumentException("No pattern to search for.");
    }
    if (text == null) {
        throw new IllegalArgumentException("Text is null");
    }

    List<Integer> matches = new ArrayList<Integer>();
    int[] map = buildFailureTable(pattern);

    int i = 0;
    int j = 0;

    while (i < text.length()) {
        if (text.charAt(i) != pattern.charAt(j)) {
            if (j != 0) {
                j = map[j];
            } else {
                i++;
            }
        } else if (j == pattern.length() - 1) {
            matches.add(i - (pattern.length() - 1));
            j = 0;
        } else {
            i++;
            j++;
        }
    }

    return matches;


}


public int[] buildFailureTable(CharSequence text) {
    if (text == null) {
        throw new IllegalArgumentException("Pattern is null.");
    }
    int i = 2;
    int j = 0;

    int[] failure = new int[text.length()];
    failure[0] = 0;
    failure[1] = 0;

    while (i < text.length()) {
        if (text.charAt(j) == text.charAt(i)) {
            failure[i] = j + 1;
            i++;
            j++;
        } else if (j > 0) {
            j = failure[j - 1];
        } else {
            failure[i] = 0;
            i++;
        }
    }

    return failure;

}

0 个答案:

没有答案