kmp算法
#include<stdio.h> #include<stdlib.h> #include<string.h> void prefix_table(char pattern[], int prefix[],int n) { prefix[0] = 0; int len = 0; int i = 1; while (i < n) { if (pattern[i] == pattern[len]) { len++; prefix[i] = len; i++; } else { if (len > 0) len = prefix[len - 1]; else { prefix[i] = len; i++; } } } } void move_prefix_table(int prefix[], int n) { for (int i = n - 1; i > 0; i--) prefix[i] = prefix[i - 1]; prefix[0] = -1; return; } void kmp_search(char text[], char pattern[]) { int n = strlen(pattern); int* prefix = (int*)malloc(sizeof(int) * n); prefix_table(pattern, prefix, n); move_prefix_table(prefix, n); int i = 0, j = 0, m = strlen(text); while (i < m) { if (j == n - 1 && pattern[j] == text[i]) { printf("Found at %d", i - j); j = prefix[j]; } if (text[i] == pattern[j]) { i++; j++; } else { j = prefix[j]; if (j == -1) { i++; j++; } } } } int main(void) { char pattern[] = "ABABCABAA"; char text[] = "ABABABCABAABABABABA"; kmp_search(text, pattern); /*int prefix[9]; int n = 9; prefix_table(pattern, prefix, 9); move_prefix_table(prefix, 9); for (int i = 0; i < 9; i++) { printf("%d ", prefix[i]); }*/ return 0; }
计算机小白记录学习过程,喜欢就点个推荐和关注吧O(∩_∩)O哈哈~

浙公网安备 33010602011771号