KMP和BF算法-C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
//以下为KMP算法
void get_next(char * T, int next[])   //修正前的next数组
{
    int i = 1, j = 0;
    next[0] = -1;
    next[1] = 0;
    int m = strlen(T);
    while (i<strlen(T) - 1)
    {
        if (j == -1 || T[j] == T[i])
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else j = next[j];
    }
}
void get_nextval(char * T, int nextval[]) //修正后的nextval数组
{
    int i = 1, j = 0;
    nextval[0] = -1;
    nextval[1] = 0;
    int m = strlen(T);
    while (i<strlen(T) - 1)
    {
        if (j == -1 || T[j] == T[i])
        {
            ++i;
            ++j;
            if (T[i] != T[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        }
        else j = nextval[j];
    }
}
int Index_KMP(char * S, char * T, int pos, int next[])   //逐项比较
{
    int j = 0, i = pos, lens = strlen(S), lent = strlen(T);
    get_next(T, next);
    while (i < lens && j < lent)
    {
        if (S[i] == T[j] || j == -1)
        {
            i++; j++;
        }
        else j = next[j];
    }
    if (j >= lent) return i - lent;
    else return -1;
}

//以下为BF算法
int Pos_BF(char * S, char * T)
{
    int pos = 1;
    for (int i = 0; i < strlen(S); i++)
    {
        if (S[i] == T[0])
            return pos;
        else
            pos++;
    }
    return 0;
}
int Index_BF(char * S, char * T)
{
    int i = 0, j = 0;
    int lens = strlen(S), lent = strlen(T);
    while (i <= lens -1  && j <= lent -1 )
    {
        if (S[i] == T[j])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    //跳出循环有两种可能,i=lens说明已经遍历完主串,匹配失败;j=lent,说明子串遍历完成,在主串中成功匹配
    if (j == lent) {
        return i - lent + 1;
    }
    //运行到此,为i==lens的情况
    return -1;
}

int main()
{
    //char *S = "adbadabbaabadabbadada", *T = "adabbadada";
    char S[30];
    char T[20];
    printf("请输入两个字符串进行匹配:\n");
    printf("请输入母串:");
    scanf("%s", S);
    printf("请输入匹配串:");
    scanf("%s", T);
    //此处开始测试KMP算法
    printf("\n**********************KMP算法**************************\n");
    int m;
    int *next = (int *)malloc((strlen(T) + 1)*sizeof(int));   //修正前的next数组
    int *nextval = (int *)malloc((strlen(T) + 1)*sizeof(int));    //修正后的nextval数组
    get_next(T, next);
    printf("修正前next数组为:");
    for (m = 0; m<strlen(T); m++)
    {
        printf("%d ", next[m] + 1);
    }
    get_nextval(T, nextval);
    printf("\n修正后的nextval数组为:");
    for (m = 0; m<strlen(T); m++)
    {
        printf("%d ", nextval[m] + 1);
    }
    int t1 = Index_KMP(S, T, 0, nextval);
    if (t1 == -1) printf("\n无匹配项!\n");
    else
    {
        printf("\n在第%d项开始匹配成功\n", t1 + 1);
    }
    //此处开始测试BF算法
    printf("\n**********************BF算法**************************\n");
    int t2 = Index_BF(S, T);
    printf("\n在第%d项开始匹配成功\n", t2);
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/zhengyu-ahu/p/12038827.html

时间: 2024-10-09 11:12:25

KMP和BF算法-C语言实现的相关文章

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

BF算法与KMP算法

BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. BF算法实现: 1 int BF(char S[],char T[],int pos) 2 {//c从第pos位开始搜索匹配 3 int i=pos,j=0; 4 while(S[i+j]!='\0'&&T[j]!='\0')

简单易懂的KMP,NEXT数组,BF算法(实例讲解)!!!

去了360面试,问了一个关于KMP的知识点,呀,完全忘了啊,太不应该了,然后就打算看看这个KMP,,, 看了好多关于KMP算法的书籍和资料,总感觉没有说的很清楚,为什么会产生next数组,为什么给出了那么简短的程序,没有一个过程,而有的帖子虽然next及其字符串匹配说的很清楚,但是推理的一些过程相当复杂,比较抽象,今天在这里简单的提一下我的理解,尽可能的把这个过程讲的简单,容易理解 从模式匹配之初:我们先是研究的是BF算法,鉴于我们经常行的需要回溯,总是做一些无用功,为了提高算法的时间度和空间度

判断一个字符串中是否包含另一个字符串(KMP、BF)

判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法. 1.BF算法 int BF(char *s, char *p){ if(s==NULL || p==NULL)return -1; int i=0; int j; while(i<strlen(s)){ j=0; while(s[i]==p[j] && j<strlen(p)){ i++; j++; } if(j==strlen(p))return i-j; i=i-j+1;

PID算法(C语言)

/************ PID算法(C语言) ************/ #include <stdio.h> #include<math.h> struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain;

BF算法

BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果. 1 //BF算法 2 #include <iostream> 3 4 using namespace std; 5 6 int main(){ 7 char dst[] = "ababa"; 8 char src[] = "ab

SHA-1算法c语言实现

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA).对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要.当接收到消息的时候,这个消息摘要可以用来验证数据的完整性.在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要. SHA1有如下特性:不可以从消息摘要中复原信息:两个不同的消息不

快速排序算法-C语言实现

注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯彻. 以下内容翻译自: http://cprogramminglanguage.net/quicksort-algorithm-c-source-code.aspx 译文: 在快速排序算法中,使用了分治策略.首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束. 步骤如下: 在序列

模式匹配-BF算法

/***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSTRLEN 255 //用户可在255以内定义最长串长 typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度 Status StrAs