串-朴素匹配算法
发布日期:2021-05-04 06:25:15 浏览次数:20 分类:技术文章

本文共 1317 字,大约阅读时间需要 4 分钟。

不匹配时两次指针回退:

i退回到上次匹配首位的下一位

j退回到子串T的首位

C语言极简版

#include
#include
#include
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */int Index(char S[], char T[], int pos) { int i = pos; int j = 0; /* j用于子串中当前位置下标值 */ while (i <= 7 && j <= 1) /* 若i小于S的长度8并且j小于T的长度2时,循环继续 */ { if (S[i] == T[j]) /* 两字母相等则继续 */ { ++i; ++j; } else /* 指针后退重新开始匹配 */ { i = i-j+1; /* i退回到上次匹配首位的下一位 */ j = 0; /* j退回到子串T的首位 */ } } if (j > 1) //j超出模式串的长度 return i-2;//2为模式串的长度 else return 0;} int main(){ printf("请输入主串\n");char zhu[100];scanf("%s",&zhu);//scanf("%s",zhu);在vs2010中能编译通过getchar();printf("请输入模式串\n");char model[100];scanf("%s",&model);getchar();int jieguo=Index(zhu,model,0);printf("请输入模式串+%d\n",jieguo);return 0;}

优化版:在字符串的首位填入字符串的长度

/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */int Index(String S, String T, int pos) {   	int i = pos;		int j = 1;				/* j用于子串中当前位置下标值 */	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */	{   		if (S[i] == T[j]) 	/* 两字母相等则继续 */      	{   		++i;         	++j;       	}       	else 				/* 指针后退重新开始匹配 */      	{              	i = i-j+2;		/* i退回到上次匹配首位的下一位 */         	j = 1; 			/* j退回到子串T的首位 */      	}      	}	if (j > T[0]) 		return i-T[0];	else 		return 0;}

上一篇:幂函数
下一篇:读程序的方法

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月14日 01时45分47秒