美文网首页
KMP子字符串查找算法

KMP子字符串查找算法

作者: Lemon_Home | 来源:发表于2017-09-26 12:45 被阅读22次

KMP算法解决的问题是,在暴力匹配时文本指针不需要回退。基本思想就是当出现不匹配时,就能知晓一部分文本的内容(因为在匹配失败之前它们已经和模式相匹配)。我们可以利用这些信息避免将指针回退到所有这些已知的字符之前。

正文——A B A A A A B A A A A A A A A
模式——B A A A A A
模式—— B A A A A A
模式—— B A A A A A
模式—— B A A A A A
模式—— B A A A A A
模式—— B A A A A A
模式—— B A A A A A

如果是暴力匹配的话,指针需要移动6次,但是可以看出其实不需要移动这么多次。
正文——A B A A A A B A A A A A A A A
模式—— B A A A A A
模式—— B A A A A A

提前判断如何重新开始查找,而这种判断只取决于模式本身。我们通过确定有限状态自动机(DFA)。模式中的每个字符都对应着一个状态,每个此类状态都能转换为字母表中的任意字符。

和模式字符串ABABAC对应的确定有限状态自动机
package chapter5;

/**
 * Created by Blue on 2017/9/4.
 */
public class KMP {
    private String pat;
    private int[][] dfa;

    public KMP(String pat) {
        this.pat = pat;
        int M = pat.length();
        int R = 256;
        dfa = new int[R][M];
        dfa[pat.charAt(0)][0] = 1;
        for (int X = 0, j = 1; j < M; j++) {
            for (int c = 0; c < R; c++) {
                dfa[c][j] = dfa[c][X];
            }
            dfa[pat.charAt(j)][j] = j + 1;
            X = dfa[pat.charAt(j)][X];
        }  
    }

    public int search(String txt) {
        int i, j, N = txt.length(), M = pat.length();
        for (i = 0, j = 0; i < N && j < M; i++)
            j = dfa[txt.charAt(i)][j];
        if (j == M) return i - M;
        else return N;
    }

    public static void main(String[] args) {
        String pat = "ABABAC";
        String txt = "BCBAABACAABABACAA";
        KMP kmp = new KMP(pat);
        System.out.println(txt);
        int offset = kmp.search(txt);
        for (int i = 0; i < offset; i++)
            System.out.print(" ");
        System.out.println(pat);
    }
}

相关文章

  • KMP算法文章合集

    字符串的查找:朴素查找算法和KMP算法 暴力匹配算法与KMP算法(串的匹配) 字符串查找算法BF和KMP 字符串匹...

  • 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串。 2.0 问题分析 “KMP算法”是对字符串查找“简单算法”的优化。 ...

  • 子字符串查找(1)

    一、定义 本文主要介绍子字符串查找的各类常用算法,如朴素匹配算法(暴力查找)、KMP算法、BM算法等。各类匹配算法...

  • JavaScript 二分查找 & KMP 算法

    KMP 查找 Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串 str1...

  • KMP算法

    KMP算法用于子字符串查找(匹配)。 KMP是三个科学家[Knuth-Morris-Pratt]发明的,旨在对暴力...

  • iOS-字符串查找

    字符串查找通常有四种方式,暴力查找,KMP查找,BoyerMoore查找以及RabinKarp算法查找,查找最简单...

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 分享几道常见字符串算法题

    1. KMP 算法 谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(...

  • KMP

    简介 用于子字符串查找 首先是暴力查找 最坏时间复杂度为O(N*M) KMP算法思想 暴力查找之所以慢是因为它每次...

  • KMP子字符串查找算法

    KMP算法解决的问题是,在暴力匹配时文本指针不需要回退。基本思想就是当出现不匹配时,就能知晓一部分文本的内容(因为...

网友评论

      本文标题:KMP子字符串查找算法

      本文链接:https://www.haomeiwen.com/subject/rkwejxtx.html