美文网首页数据结构
数据结构-串:KMP模式匹配算法

数据结构-串:KMP模式匹配算法

作者: 天降小纸箱 | 来源:发表于2020-09-24 10:59 被阅读0次

题目:1366: KMP字符串模式匹配算法

描述:KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。严蔚敏老师的书中详细描述了KMP算法,同时前面的例子中也描述了子串移动位置的数组实现的算法。前面你已经实现了子串移动的数组,现在就来利用该数组来实现KMP模式匹配。

输入: 3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。

image.png
#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

// KMP算法,打印next数组
void showNext(int *next, int len) {
//    printf("T\ti\tnext\n");
    int i = 1;
    while (i <= len) {
        printf("%d ", next[i++]);
    }
    printf("\n");
}

/**
 * 前缀:包含第一个字符,且不包含最后一个字符的子串
 * 后缀:包含最后一个字符,且不包含第一个字符的子串
 * next[j] = T 的最长相等前后缀长度+1
 * 特别的:next[1]=0
 *      next 数组为了方便使用,空出 下标为0的位置,从1开始填充数据
 *  【例】
 *  --------------------------------------------
 *  * J      |  1  |  2  |  3  |  4  |  5  |  6
 *  * T      |  a  |  b  |  a  |  b  |  a  |  a
 *  * next   |  0  |  1  |  1  |  2  |  3  |  4
 *  --------------------------------------------
 * @param T :模式串
 * @param next :next数组
 */
void getNext(string T, int next[]) {
    int i = 1; // 后缀
    int j = 0; // 前缀
    int len = T.length();
    next[1] = 0;
    while (i < len) {
        if (0 == j || T[i-1] == T[j-1]) {
            ++i;
            ++j;
            next[i] = j; /** // next数组生成,若注释此行,使用下面注释部分代码为next数组的优化 */
           /*  // next 数组的优化 -> nextval 数组
            if (T[i-1] != T[j-1]) {
                next[i] = j;
            } else {
                next[i] = next[j];
            }*/
        } else {
            j = next[j];
        }
    }
    showNext(next, len);
}

// 返回子串T在主串S第pos个字符之后的位置
int index_KMP(string S, string T, int pos) {
    int i = pos;
    int j = 1;
    int next[T.length() + 1];
    getNext(T, next);
    while (i <= S.length() && j <= T.length()) {
        if (0 == j || S[i] == T[j-1]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    if (j > T.length()) {
        return i - T.length() + 1;
    } else return 0;

}

int main() {
    string s0="0",t0="0";
    string S1, T1, S2, T2, S3, T3;
    cin >> S1 >> T1 >> S2 >> T2 >> S3 >> T3;
    int index = index_KMP(S1, T1, 0);
    printf("%d\n", index);
    index = index_KMP(S2, T2, 0);
    printf("%d\n", index);
    index = index_KMP(S3, T3, 0);
    printf("%d\n", index);

    return 0;
}

运行结果

image.png

相关文章

  • 字符串匹配算法

    KMP算法 算法介绍 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。...

  • 09--KMP

    [toc] KMP算法原理 KMP思想 假设字符串abcdefgab和模式串abcdex,进行匹配,当匹配到x位置...

  • KMP算法文章合集

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

  • 模式匹配算法

    《数据结构(C语言版)》上给出了两种模式匹配算法,BF算法和KMP算法。 存在一个主串S和一个模式T,要在主串S中...

  • 数据结构—KMP算法

    KMP算法是一种改进的字符串算法 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速...

  • KMP算法讲解

    KMP 算法 : 模式匹配算法 主要应用于 字符串的匹配。9月21日更新

  • 一些有关算法的

    字符串模式匹配算法 字符串的KMP算法详解部分匹配表(即)向右移一位就可以得到next数组。字符串模式匹配算法 R...

  • 数据结构与算法-KMP算法

    KMP模式匹配算法原理 我们首先从原理上分析一下,KMP算法哪里比朴素算法好。假设主串S="abcdefgab",...

  • 《大话数据结构》笔记一(基础)

    1 数据2 算法3 线性表4 栈5 队列6 串朴素模式匹配算法 -子串的定位操作:从主串中找到子串KMP模式匹配算...

  • 动态规划(二,kmp算法)

    概述: kmp算法是一种改进的字符串匹配算法.kmp算法的核心思想是利用比对失败的信息,减少模式串与目标串的比对次...

网友评论

    本文标题:数据结构-串:KMP模式匹配算法

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