串的模式匹配算法 ------ KMP算法

news/2024/7/8 11:40:14
//KMP串的模式匹配算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int* get_next(char t[], int length)
{
    int i = 0, j = -1;
    int* next = (int *)malloc(length * sizeof(int));
    next[0] = -1;
    while (i < length)
    {
        if (j == -1 || t[i] == t[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }

    return next;
}

int  Index_KMP(char s[], char t[], int sl, int tl, int next[])
{
    int j, i;
    j = 0;
    i = 0;
    while (j < tl && i < sl)
    {
        if (j == -1 || s[i] == t[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    if (j == tl)
    {
        return i - tl;
    }
    else
    {
        return 0;
    }
}


//计算next函数修正值的算法
int *get_nextval(char t[], int length)
{
    int i = 0, j = -1;
    int* nextval = (int*)malloc(length*sizeof(int));
    nextval[0] = -1;
    while (i < length)
    {
        if (j == -1 || t[i]==t[j])
        {
            j++;
            i++;
            if (t[j]!=t[i])
            {
                nextval[i] = j; 
            }
            else
            {
                nextval[i] = nextval[j]; //回溯到下标为nextval[j]但元素与下标为nextval[i]的元素不相同的位置
            }
        }
        else
        {
            j = nextval[j];
        }
    }

    return nextval;    
}


int main()
{

    char s[] = "acabaabaabcacaabc";
    char t[] = "abaabcac";
    char t2[] = "abcdabd";
    int tl = strlen(t);
    int sl = strlen(s);
    /*int *next = get_next(t, tl);
    int c = Index_KMP(s, t, sl, tl, next); //返回开始正确匹配的下标(s的下标)
    printf("%d\n", c);*/
    int l = strlen(t2);
    int * nextval = get_nextval(t,tl);
    /*for(int i = 0; i<l;i++)
    {
        printf("%d ",nextval[i]);
    }*/
    int c = Index_KMP(s, t, sl, tl, nextval);
    printf("%d\n",c);

    printf("\n");
    return 0;
}

理解:

模式匹配就是将主串中下标为i的元素与模式串中下标为j的元素进行比较(比较过程中i不会回溯 而j的值会按照next对应的值进行回溯)

转载于:https://www.cnblogs.com/Ghost4C-QH/p/10363705.html


http://www.niftyadmin.cn/n/4556397.html

相关文章

C#/.net中使用到的报表教程

然后群里面的人有很多小程序的 ||| C#中的水晶报表 值得研究 你去专门找教程吧 答案补充 这个网上一搜一大堆 可以去找找关于编程的群 给你个建议

现在急用 java要怎么才能学好哦 不知道能不能学好。 大概多长时间

fromuid29811 ||| c#简单 加油加油 ||| 我现在在做java软件开发 我也在学 我们一起努力 加油吧 你一定行的 相信你自己 java挺有用的 好好学习 和自己付出的精力而谈 其实那种语言学了 c#比java灵活 高数方面会设计很多 所以要求也会高 因为都是底层的东西 但是如果做好了就高薪…

LOJ-10094(强连通分量)

题目链接&#xff1a;传送门 思路&#xff1a; 先缩点&#xff0c;然后统计入度为0的点即可。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn 1e610; int num[maxn],low[maxn],tim,col,co[maxn]; int head[m…

【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

写在前面 一直在探寻&#xff0c;那优雅的美&#xff1b;一直在探寻&#xff0c;那精湛的技巧&#xff1b;一直在探寻&#xff0c;那简单又直白&#xff0c;优雅而美丽的代码。 ------ 但是在JavaScript的动态类型、有时尴尬的自动类型转换&#xff0c;以及 “0 false” 是tru…

一个VB编程 急 帮忙

" exit sub end if Ssqr(l*(l-a)*(l-b)*(l-c)) print S 试一下吧 ||| 将代码直接粘贴然后运行即可 l c b ") if ubound(strcomp) 2 then n1val(strcomp(0)) n2val(strcomp(1)) n3val(strcomp(3)) 判断都跟楼上差不多吧 dim strComp() as string 3分离用Split涵数 2 模…

高手进 C语言问题

得到的就是树的高度 然后直接舍去小数点后的数 底数为2 log(n) 那么高度是 0 --> 结点共有 1高度是 1 --> 结点共有 3高度是 2 --> 结点共有 7高度是 3 --> 结点共有 15高度是 4 --> 结点共有 31高度是 5 --> 结点共有 63高度是 6 --> 结点共有 127高度是…

知识点累积

1&#xff0c;反向解析 示例代码&#xff1a; def display_record(self, objNone, is_headerNone, *args, **kwargs):if is_header:return 跟进record_url reverse(stark:web_consultrecord_list, kwargs{customer_id: obj.pk})return mark_safe(<a target"_blank&quo…

ref C#中的ShowDialog和Show的区别 为什么再ShowDialog中修改变量时原窗口中的变量不会被改变 out如何在这里应用

我们可以将show方法转化为showdialog方法 很是不顺手 窗口的顺序也有可能被再次打乱 一但出现问题 而且 那样我们还有花费时间寻找我们要用的窗口 我们往往不喜欢窗口之间的随意切换 比如你在浏览器点击另存为弹出的窗口就是模式窗口 但是他由于未进行绑定 它所显示的各个窗口、…