c语言 KMP算法实现

目录:

  • 简介
  • 串的匹配
  • KMP算法
  • 改进的KMP算法

简介

待写

串的匹配

待写

KMP算法

代码:

/*
 * @Descripttion: KMP算法
 * @version: 版本
 * @Author: YueXuanZi
 * @Date: 2023-07-28 15:12:50
 * @LastEditors: YueXuanZi
 * @LastEditTime: 2023-07-28 16:04:09
 * @Experience: 心得体会
 */
#include 
#include 
// 输出数组
void printArray(int arr[], int size) {
    printf("数组的元素是:");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}


// char pattern[] = "ABABCABAB"; 0 0 1 2 0 1 2 3 4
void computeLPSArray(char* pattern, int M, int* lps) {
    int len = 0;  // 最长公共前后缀的长度
    int i = 1;
    lps[0] = 0;  // 第一个字符没有最长公共前后缀

    while (i < M) {
        if (pattern[i] == pattern[len]) {
            len++;
            lps[i] = len;
            i++;
        } else {
            if (len != 0) {
                len = lps[len - 1];
            } else {
                lps[i] = 0;
                i++;
            }
        }
    }
}

void KMP(char* text, char* pattern) {
    int M = strlen(pattern); // 字符长度
    int N = strlen(text);
    int lps[M];  // 最长公共前后缀数组

    computeLPSArray(pattern, M, lps);

    
    int size = sizeof(lps) / sizeof(lps[0]);

    printArray(lps, size);

    int i = 0;  // text的索引
    int j = 0;  // pattern的索引

    while (i < N) {
        if (text[i] == pattern[j]) {
            i++;
            j++;
        }

        if (j == M) {
            printf("在位置 %d 找到匹配\n", i - j);
            j = lps[j - 1];
        } else if (i < N && text[i] != pattern[j]) {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
}


int main() {
    system("chcp 65001");
    char text[] = "ABABDABACDABABCABAB";
    char pattern[] = "ABABCABAB";
    KMP(text, pattern);
    return 0;
}

改进的KMP算法

设置一个nextval数组
如果字串pattern的j位置的字符与pattern的next[j]位置的字符相同,则令nextval[j] = nextval[next[j]],否则,nextval[j] = next[j]

你可能感兴趣的:(小知识(杂),算法,c语言)