数据结构之字符串的模式匹配算法

参考书籍:严蔚敏《数据结构》(C语言版)79页

函数原型:int strIndex(SString S,SString T,int pos)

函数说明:函数从S字符串的第pos位置开始,验证S中是否存在字符串T,若存在返回T在S中的位置,否则返回0。例如,当S = today is a good day,T = good,若pos = 1,则返回11,若pos = 12,则返回0。假设S长为m,T长为n,则算法复杂度为m*n。

特别注意:本处使用的串存储结构为定长顺序存储结构,字符从S[1]开始存储,而S[0]则用来存储字符串的长度。

编程软件:DEVC++

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 25

typedef unsigned char SString[MAXSIZE+1];

int strIndex(SString S,SString T,int pos)
{
	int i = pos;
	int j = 1;
	while(i<=S[0]&&j<=T[0])//从S的第pos个字符开始比较 
	{
		printf("S[%d] = %c,T[%d] = %c\n",i,S[i],j,T[j]);
		if(T[j] == S[i]){i++; j++;}//相同则继续比较 
		else{i = i-j+2; j=1;}//不相等则返回到下一个位置开始比较 
	}
	if(j>T[0]) return i-T[0];//j>T[0]表示已经比较完T[0]长度的字符串 
	else return 0;
} 

int main()
{
	SString name;
	SString str;
	int i = 1,j = 1,pos;
	char *s = "chenxuejun\0";
	char *t = "jun\0";
	
	printf("给name赋值name = chenxuejun\n"); 
	while(*s != '\0')//给name赋值name = chenxuejun;
	{
		name[i] = *s;
		name[0] = i;
		s++;i++;
	}
	
	printf("\n给str赋值:str = jun\n\n"); 
	while(*t != '\0')//给str赋值:str = jun 
	{
		str[j] = *t;
		str[0] = j;
		t++;j++;
	}
	pos = strIndex(name,str,5);
	printf("\nstr在name的第%d位置\n",pos);
}

运行结果:

posted @ 2019-08-20 11:04  昨夜昙花  阅读(23)  评论(0)    收藏  举报