kmp字符串匹配

主串的指针一直往前移动,不回溯。 只移动模式串的指针。

比较字符不匹配时,重新定位模式串的指针, 通过提前计算:主串的后缀和模式串的前缀相等的个数,可以得到模式串重新定位的指针位置。

重新定位的模式串指针位置由一个额外的数组保存:jr = next[j]. j表示当前比较错误的位置 jr表示重新定位的位置

优化next数组—>nextval 在计算next数组时,计算出的重新定位的指针位置jr所对应的字符若是与当前匹配失败位置j指向的字符相同时,则将next[jr]的值赋给next[j]。

实例:

public Boolean kmp(List sOrder, List tOrder) {  
    int sLen = sOrder.size(), tLen = tOrder.size();  
    int[] fail = new int[tOrder.size()];  
    Arrays.fill(fail, -1);  
    for (int i = 1, j = -1; i < tLen; ++i) {  
        while (j != -1 && !(tOrder.get(i).equals(tOrder.get(j + 1)))) {  
            j = fail[j];  
        }  
        if (tOrder.get(i).equals(tOrder.get(j + 1))) {  
            ++j;  
        }  
        fail[i] = j;  
    }  
    for (int i = 0, j = -1; i < sLen; ++i) {  
        while (j != -1 && !(sOrder.get(i).equals(tOrder.get(j + 1)))) {  
            j = fail[j];  
        }  
        if (sOrder.get(i).equals(tOrder.get(j + 1))) {  
            ++j;  
        }  
        if (j == tLen - 1) {  
            return true;  
        }  
    }  
    return false;  
}
Copyright © qgao 2021-* all right reserved,powered by Gitbook该文件修订时间: 2022-06-06 16:56:43

results matching ""

    No results matching ""