【数据结构】朴素模式匹配算法

   |   2 minute read   |   Using 324 words

code

#include <stdio.h>
#include <string.h>

#define MAX_STRING_LENGTH 100

typedef struct {
    char data[MAX_STRING_LENGTH];
    size_t length;
}SString;

void InitSString(SString* s, char* str){
    strncpy(s->data, str, MAX_STRING_LENGTH-1);
    s->data[MAX_STRING_LENGTH-1] = '\0';
    s->length = strlen(s->data);
}

int NaivePatternMatching(SString *main_string, SString *pattern_string) {
    for (int main_substring_index = 0; main_substring_index < main_string->length - pattern_string->length ; ++main_substring_index) {

        printf("[main_substring_index = %d] \n", main_substring_index);
        printf("\t\t主串子串[%d] \t", main_substring_index);
        for (int k = main_substring_index; k < main_substring_index + pattern_string->length ; ++k) {
            printf("%c", main_string->data[k]);
        }
        printf("\n");
        printf("\t\t模式串\t\t");
        printf("%s\n",pattern_string->data);

        for (int pattern_string_index = 0; pattern_string_index < pattern_string->length; ++pattern_string_index) {
            if (main_string->data[main_substring_index + pattern_string_index] != pattern_string->data[pattern_string_index]) {
                printf("\t \tnot match \t%c -> %c\n" , main_string->data[main_substring_index + pattern_string_index], pattern_string->data[pattern_string_index]);
                break;
            }

            if (main_string->data[main_substring_index + pattern_string_index] == pattern_string->data[pattern_string_index]) {
                printf("\t \tmatch \t\t%c -> %c\n" , main_string->data[main_substring_index + pattern_string_index], pattern_string->data[pattern_string_index]);
            }
            if(pattern_string_index == pattern_string->length - 1){
                printf(" \t\t FOUND IT  !!!\n");
                return main_substring_index;
            }
        }
    }
    printf(" \t\t Not FOUND IT  !!!");
    return -1;
}

int NaivePatternMatching2(SString *main_string, SString *pattern_string) {
    int i=1, j=1;
    while(i<=main_string->length && j<=pattern_string->length){
        if(main_string->data[i-1]==pattern_string->data[j-1]) {
            i++;
            j++;
        }else{
            i=i-j+2;
            j=1;
        }
        if(j>pattern_string->length){
            printf(" \t\t FOUND IT  !!!\n");
            return i-j;
        }
    }
    printf(" \t\t Not FOUND IT  !!!");
    return -1;
}

int main() {
    SString  main_string;
    InitSString(&main_string, "abaabaabcabaabc");
    printf("[INFO] 主串\t\t %s\n", main_string.data);

    SString  pattern_string;
    InitSString(&pattern_string, "abaabc");
    printf("[INFO] 模式串\t %s\n", pattern_string.data);

    int index = NaivePatternMatching(&main_string, &pattern_string);
    printf(" [INFO] 匹配位置\t %d\n", index);

    return 0;
}

输出

[INFO] 主串		 abaabaabcabaabc
[INFO] 模式串	 abaabc
[main_substring_index = 0] 
		主串子串[0] 	abaaba
		模式串		abaabc
	 	match 		a -> a
	 	match 		b -> b
	 	match 		a -> a
	 	match 		a -> a
	 	match 		b -> b
	 	not match 	a -> c
[main_substring_index = 1] 
		主串子串[1] 	baabaa
		模式串		abaabc
	 	not match 	b -> a
[main_substring_index = 2] 
		主串子串[2] 	aabaab
		模式串		abaabc
	 	match 		a -> a
	 	not match 	a -> b
[main_substring_index = 3] 
		主串子串[3] 	abaabc
		模式串		abaabc
	 	match 		a -> a
	 	match 		b -> b
	 	match 		a -> a
	 	match 		a -> a
	 	match 		b -> b
	 	match 		c -> c
 		 FOUND IT  !!!
 [INFO] 匹配位置	 3



© 2025 by clayliu. All Rights Reserved.