算法——KMP算法

暴力匹配

从主串的第一个位置起和模式串的第一个字符开始比较,如果相等,则继续逐一比较后 续字符;否则从主串的第二个字符开始,再重新用上一步的方法与模式串做比较,以此类推, 直到比较完模式串中的所有字符。

假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?

如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:

  • 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;
  • 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。

理清楚了暴力匹配算法的流程及内在的逻辑,咱们可以写出暴力匹配的代码,如下:

package 暴力匹配;

public class BaoLiMatches {
    public static void main (String[] args) {
        String str1 = "abcdefghigkm";
        String str2 = "gkm";
        int num = matches(str1, str2);
        System.out.println(num);//输出9为正确;
    }

    public static  int matches (String str1, String str2) {
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        int len1= s1.length;
        int len2= s2.length;
        int i=0;//str1索引
        int j=0;//str2索引
        while (i < len1 && j < len2) {
            if (s1[i] == s2[j]) {
                i++;
                j++;
            }else{
                i=i-j+1;
                j=0;
            }
        }
        if (j==len2){
            return i-j;
        }else {
            return -1;
        }
    }
}

用暴力匹配解决的话会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着匹配,浪费了大量的时间。

KMP算法

算法——KMP算法_第1张图片 

算法——KMP算法_第2张图片

算法——KMP算法_第3张图片

算法——KMP算法_第4张图片

算法——KMP算法_第5张图片

算法——KMP算法_第6张图片

算法——KMP算法_第7张图片

算法——KMP算法_第8张图片

算法——KMP算法_第9张图片

对于上述的过程,部分匹配表是至关重要的,那么,这张表是如何产生的呢?

算法——KMP算法_第10张图片

算法——KMP算法_第11张图片

代码如下:

首先获取部分匹配表

算法——KMP算法_第12张图片

然后就是KMP代码

算法——KMP算法_第13张图片

你可能感兴趣的:(算法——KMP算法)