KMP算法

作者: 往sir_b2a2 | 来源:发表于2020-07-28 11:29 被阅读0次

正确的如下:

#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
int* getNext(string duan)//和下面的函数顺序不能写反!!!
{
    int length_d = duan.length();
    int* next = (int*)calloc(length_d, sizeof(int));
    next[0] = -1;
    int c = 0, d = -1;
    while (c < length_d - 1)//当while里面c=length_d-2时,if{}里面next[length_d-1]已经算好了;当while里面c=length_d-1时,if{}里面的c满足退出条件
    {
        if (-1 == d || duan[c] == duan[d])
        {
            c++;
            d++;
            next[c] = (duan[c] != duan[d] ? d : next[d]);
        }
        else
            d = next[d];
    }
    return next;
}
int IndexKmp(string chang, string duan)
{
    int* next = getNext(duan);
    int c = 0, d = 0;
    int length_c = chang.length(), length_d = duan.length();
    while (c < length_c && d < length_d)
    {
        if (-1 == d || chang[c] == duan[d])
        {
            c++;
            d++;
        }
        else
            d = next[d];
    }
    free(next);
    return length_d == d ? c - d : -1;
}
int main()
{
    string chang ,duan ;
    int i;
    cout << "输入主字符串:";
    cin >> chang ;
    cout << "输入匹配的短字符串:";
    cin >> duan;
    cout << IndexKmp(chang, duan);
    return 0;
}

image.png

和下面错误的区别就是一个头文件cstring(不是点)、string和char*、length()和strlen
错误的如下,日后解决,现在不会

#include<iostream>
#include<stdlib.h>
using namespace std;
int* getNext(char* duan)
{
    int length_d = strlen(duan);
    int* next = (int*)calloc(length_d, sizeof(int));
    next[0] = -1;
    int c = 0, d = -1;
    while (c < length_d - 1)
    {
        if (-1 == d || duan[c] == duan[d])
        {
            c++;
            d++;
            next[c] = (duan[c] != duan[d] ? d : next[d]);
        }
        else
            d = next[d];
    }
    return next;
}
int IndexKmp(char* chang, char* duan)
{
    int* next = getNext(duan);
    int c = 0, d = 0;
    int length_c = strlen(chang), length_d = strlen(duan);
    while (c < length_c && d < length_d)
    {
        if (-1 == d || chang[c] == duan[d])
        {
            c++;
            d++;
        }
        else
            d = next[d];
    }
    free(next);
    return length_d == d ? c - d : -1;
}
int main()
{
    char chang[10], duan[5];
    int i;
    cout << "输入主字符串:";
    cin >> chang;
    cout << "输入匹配的短字符串:";
    cin >> duan;
    cout << IndexKmp(chang, duan);
    return 0;
}

答案和正确的一样,但是程序会蹦出一个bug: image.png

相关文章

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • KMP算法文章合集

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

  • 串的模式匹配算法

    KMP算法 算法匹配

  • 问答|KMP算法学习笔记

    问题 目录KMP是什么,做什么用的KMP算法的高效体现在哪如何KMP算法的next数组KMP的代码KMP的时间复杂...

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

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

  • 字符串匹配 - KMP算法

    前面我们介绍非常高效的 BM 算法,今天我们介绍另一个非常出名且高效的 KMP 算法。 KMP 算法思想 KMP ...

  • KMP算法及优化

    转载请注明出处: KMP算法及优化 今天看到同学在复习数据结构书上的KMP算法,忽然发觉自己又把KMP算法忘掉了,...

  • KMP算法(字符串匹配问题)

    一、是什么? 注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有...

  • KMP算法

    KMP算法

网友评论

    本文标题:KMP算法

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