1. 串的简单模式匹配算法
简单模式匹配 Brute-Force(布鲁斯-福斯)算法是一种带回溯的匹配算法,算法的基本思想是:从主串 s 的第一个字符开始,和模式串 t 的第一个字符开始比较,如果相等,就继续比较后续字符,如果不等,则回溯到主串 s 的第2个字符开始重新和模式串 t 比较,直到模式串 t 中的每一个字符和主串 s 中的一个连续字符子序列全部相等,则称匹配成功,返回和 t 中第一个字符相等的字符在主串 s 中的位置;或者主串中没有和模式串相等的字符序列,则匹配不成功。
实现时设三个指示器:i,j,start;i 指向主串 s 中当前比较的字符,j 指向子串 t 中当前比较的字符,start 记录每趟比较时在主串 s 中的起点。
1.1 简单模式匹配算法
/*简单模式匹配算法(有回溯)*/
int StrIndex(SString* s, SString* t) {
int i, j, start = 0;
if (t->len == 0) //模式串为空时是任意串的匹配串
return 0;
i = start, j = 0;
while (i < s->len && j < t->len) {
if (s->ch[i] == t->ch[j]) {
//当前对应字符相等时向前推进
i++;
j++;
}
else {
start++; //当前对应字符不相等时回溯
i = start; //主串从start+1开始
j = 0; //模式串从0开始
}
}
if (j >= t->len)
return start; //匹配成功时,返回匹配起始位置
else
return -1; //匹配不成功,返回-1
}
1.2 完整实现代码
# include<stdio.h>
# define MAXLEN 40
/*顺序串的存储结构*/
typedef struct {
char ch[MAXLEN];
int len;
}SString;
/*顺序串初始化*/
void StrInit(SString* s) {
s->len = 0;
}
/*顺序串赋值*/
void StrAssign(SString* s