暴力匹配算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct String
{
char *data;
int len;
} String;
String *initString()
{
String *string = (String *)malloc(sizeof(String));
if (string == NULL)
{
printf("malloc string error\n");
exit(1);
}
string->data = NULL;
string->len = 0;
return string;
}
void stringAssign(String *string, char *data)
{
if (string->data != NULL)
{
free(string->data);
string->data = NULL;
}
int len = 0;
char *temp = data;
while (*temp) // 记录长度
{
len++;
temp++;
}
if (len == 0)
{
string->data = NULL;
string->len = 0;
}
else
{
temp = data; // 重新置位temp
string->len = len;
string->data = (char *)malloc(sizeof(char) * (len + 1)); // 给string->data 在堆上分配空间
if (string->data == NULL)
{
printf("malloc string—>data error\n");
exit(1);
}
for (int i = 0; i < len; i++)
{
string->data[i] = *temp;
temp++;
}
}
}
void printString(String *string)
{
for (int i = 0; i < string->len; i++)
{
if (i == 0)
{
printf("%c ", string->data[i]);
}
else
{
printf(" -> %c ", string->data[i]);
}
}
printf("\n");
}
void forceMatch(String *master, String *sub)
{
int i = 0; // 记录当前主串的位置
int j = 0; // 记录当前子串的位置
while (i < master->len && j < sub->len)
{
if (master->data[i] == sub->data[j])
{
i++;
j++;
}
else
{
i = i - j + 1; // i 回到起点的后一位
j = 0; // 子串直接回到起点
}
}
if (j == sub->len) // 如果相等,匹配成功
{
printf("暴力匹配成功!\n");
}
else
{
printf("暴力匹配失败\n");
}
}
int main()
{
String *stringmaster = initString();
stringAssign(stringmaster, "hello world");
printString(stringmaster);
printf("----------------------------------------------------------\n");
String *stringsub = initString();
stringAssign(stringsub, "lo wo");
printString(stringsub);
printf("----------------------------------------------------------\n");
forceMatch(stringmaster, stringsub);
return 0;
}
运行结果:
superlan@GodFather:~/C_Language/data_structure$ ./a.out
h -> e -> l -> l -> o -> -> w -> o -> r -> l -> d
----------------------------------------------------------
l -> o -> -> w -> o
----------------------------------------------------------
暴力匹配成功!