【数据结构】朴素模式匹配算法
| 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