KMP算法

64 阅读1分钟

KMP算法详解

作者是通过PPT来进行学习的,百度网盘的链接在下面:

链接:https://pan.baidu.com/s/1cebVaXwwsFa7-Fh1O2sd3A 
提取码:6666

一、基本思想

1.2、KMP算法基本思想

KMP算法当中最主要的部分是是前面的那个公式:

当模式串的指针指向j的时候,前j-1个字符当中,从0开始往右边数k个字符,从j-1开始往左边数k个字符,如果这个字符是相等的,则next[j] = k;

		 -1 ,j = 0
next[j]= max {k | 1≤k<j 且T[0] … T[k -1] = T[j-k]… T[j - 1]}
		 0,其它情况

在这里插入图片描述

1.3、改进后的KMP算法

实际上KMP算法还可以继续完善。如果取主串ababc,模式串为ababa,当i=4,j=4的时候,c不等于a,于是j= next[4]=2,模式串的第2号位和4号位是相等,因为第4号的a已经和主串的第4号位c已经比过了,所以第2号位的a和主串的第4号位c没有必要再比较了,直接跳过去使得j=0。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、代码实现

2.1、源代码

public class KMP {

    public static void main(String[] args) {
        String mainStr = "abababc";
        String subStr = "ababc";
        KMP kmp = new KMP();

        System.out.println(kmp.patternMatching(mainStr,subStr));
    }


    public int[] getNext(String T) {
        int[] next = new int[T.length()];
        int j = 0;
        int k = -1;
        next[0] = -1;
        while (j < T.length() - 1) {
            if (k == -1 || T.charAt(j) == T.charAt(k)) {
                k++;
                j++;
                next[j] = k;
            } else {
                k = next[k];
            }
        }
        return next;
    }

    public int[] getNextVal(String T) {
        int[] nextVal = new int[T.length()];
        int j = 0;
        int k = -1;
        nextVal[0] = -1;
        while (j < T.length() - 1) {
            if (k == -1 || T.charAt(j) == T.charAt(k)) {
                k++;
                j++;

                if (T.charAt(j) == T.charAt(k)) {
                    nextVal[j] = nextVal[k];
                } else {
                    nextVal[j] = k;
                }
            } else {
                k = nextVal[k];
            }
        }
        return nextVal;
    }


    public int patternMatching(String S, String T) {
        int[] next = getNext(T);
        int i = 0;
        int j = 0;
        while (i < S.length() && j < T.length()) {
            if (j == -1 || S.charAt(i) == T.charAt(j)) {
                i++;
                j++;
            } else {
                j = next[j];
            }
        }
        if (j >= T.length()) {
            return i - T.length();
        } else {
            return 0;
        }
    }
}

2.2、运行结果

2

(j >= T.length()) {
return i - T.length();
} else {
return 0;
}
}
}


## 2.2、运行结果

```java
2