117.info
人生若只如初见

c语言字符串匹配算法怎么写

C语言字符串匹配算法有很多种,下面介绍几种常用的算法实现。

  1. Brute-Force算法(朴素算法)
int strStr(char* haystack, char* needle) {
    int i, j;
    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    
    for (i = 0; i <= len1 - len2; i++) {
        for (j = 0; j < len2; j++) {
            if (haystack[i + j] != needle[j]) {
                break;
            }
        }
        if (j == len2) {
            return i;
        }
    }
    
    return -1;
}
  1. KMP算法(Knuth-Morris-Pratt算法)
void getNext(char* needle, int* next) {
    int i, j;
    int len = strlen(needle);
    
    next[0] = -1;
    i = 0;
    j = -1;
    while (i < len) {
        if (j == -1 || needle[i] == needle[j]) {
            i++;
            j++;
            next[i] = j;
        } else {
            j = next[j];
        }
    }
}

int strStr(char* haystack, char* needle) {
    int i, j;
    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    int* next = (int*)malloc(sizeof(int) * len2);
    
    getNext(needle, next);
    
    i = 0;
    j = 0;
    while (i < len1 && j < len2) {
        if (j == -1 || haystack[i] == needle[j]) {
            i++;
            j++;
        } else {
            j = next[j];
        }
    }
    
    free(next);
    if (j == len2) {
        return i - j;
    } else {
        return -1;
    }
}
  1. Boyer-Moore算法
#define MAX_CHAR 256

int max(int a, int b) {
    return a > b ? a : b;
}

void badCharHeuristic(char* needle, int* badChar) {
    int i;
    int len = strlen(needle);
    for (i = 0; i < MAX_CHAR; i++) {
        badChar[i] = -1;
    }
    for (i = 0; i < len; i++) {
        badChar[(int)needle[i]] = i;
    }
}

void goodSuffixHeuristic(char* needle, int* goodSuffix) {
    int i, j;
    int len = strlen(needle);
    int* suffix = (int*)malloc(sizeof(int) * (len + 1));
    
    for (i = 0; i <= len; i++) {
        suffix[i] = -1;
    }
    
    for (i = len - 1; i >= 0; i--) {
        if (suffix[i] == -1) {
            suffix[i] = len - i - 1;
            for (j = 0; j < i; j++) {
                if (needle[j] == needle[len - i + j]) {
                    suffix[j] = len - i + j;
                }
            }
        }
    }
    
    for (i = 0; i < len; i++) {
        goodSuffix[i] = len - suffix[i + 1];
    }
    for (i = 0; i <= len; i++) {
        goodSuffix[len] = len - suffix[i + 1];
    }
    
    free(suffix);
}

int strStr(char* haystack, char* needle) {
    int i = 0, j = 0;
    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    int badChar[MAX_CHAR];
    int* goodSuffix = (int*)malloc(sizeof(int) * (len2 + 1));
    
    badCharHeuristic(needle, badChar);
    goodSuffixHeuristic(needle, goodSuffix);
    
    while (i <= len1 - len2) {
        j = len2 - 1;
        while (j >= 0 && needle[j] == haystack[i + j]) {
            j--;
        }
        if (j < 0) {
            free(goodSuffix);
            return i;
        } else {
            i += max(goodSuffix[j], j - badChar[(int)haystack[i + j]]);
        }
    }
    
    free(goodSuffix);
    return -1;
}

以上是几种常用的字符串匹配算法的C语言

未经允许不得转载 » 本文链接:https://www.117.info/ask/fee83AzsLAA9fAlQ.html

推荐文章

  • c语言button的用法是什么

    在C语言中,button是指用于处理和控制用户界面的按钮。一个按钮可以被点击,以触发相关的操作或事件。
    要在C语言中使用按钮,需要以下步骤: 首先,需要导入...

  • c语言中的ifdef有什么作用

    在C语言中,#ifdef是一个条件编译指令,用于在编译时根据预定义的宏来判断是否包含或排除特定的代码段。它的作用主要有以下几个方面: 实现跨平台编译:通过在不...

  • C语言创建对象的方式有哪几种

    在C语言中,没有直接的方式来创建对象。因为C语言是一种过程性的语言,没有面向对象的特性。然而,可以通过以下几种方式来模拟对象的创建: 结构体:使用结构体来...

  • C语言中怎么用ifdef检查宏

    在C语言中,可以使用#ifdef来检查宏是否已定义。#ifdef用于检查一个宏是否已经被定义,如果已经被定义,则执行#ifdef和#endif之间的代码,否则忽略这段代码。

  • perl脚本运行的方法是什么

    要运行perl脚本,可以按照以下步骤进行: 确保你的系统上已经安装了Perl解释器。大多数Linux和Unix系统都默认安装了Perl。在Windows系统上,你可以从Perl官方网站...

  • jmeter录制后怎么去掉多余的请求

    在JMeter中录制的脚本可能会包含一些不必要的请求,您可以按照以下步骤去除这些多余请求: 打开JMeter,选择需要修改的脚本。
    在测试计划树中,展开“线程组...

  • Scala语言的优点和缺点是什么

    Scala语言的优点和缺点如下:
    优点: 强大的静态类型系统:Scala具有强大的静态类型系统,能够在编译时捕获许多错误,提高代码质量和可靠性。
    支持面向...

  • linux安装perl模块的方法是什么

    在Linux上安装Perl模块有多种方法,以下是其中的几种常见方法: 使用CPAN(Comprehensive Perl Archive Network):CPAN是Perl社区的模块仓库,提供了大量的Perl...