C 언어로 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 <stdio.h>
#include <string.h>
// 输出数组
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 배열을 설정하고
문자열 패턴의 j 위치에 있는 문자가 패턴의 next[j] 위치에 있는 문자와 동일하면 nextval[j] = nextval[next[j]], 그렇지 않으면 nextval[j] = 다음[j ]

Supongo que te gusta

Origin blog.csdn.net/weixin_51395608/article/details/131982018
Recomendado
Clasificación