匹配字符串

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct { //定义结构体
	char ch[MAXSIZE];
	int length;
}SString;

void InitSString(SString &S){  //初始化结构体
	S.length = 0;
}

void Scanfs(SString& S){  //遍历输入串
	char a;
	a = getchar();
	while (a != '\n'){
		S.length++;
		S.ch[S.length] = a;
		a = getchar();
	}
}

void Printfs(SString S) {  //遍历输出串
	int a = 1;
	while (a <= S.length)
	{
		putchar(S.ch[a]);
		a++;
	}
	printf("\n");
}

void JDPPSF(SString S,SString T){  //简单匹配模式算法
	int i = 1, j = 1, n = 1;
	while (j <= T.length && i <= S.length){
		if (S.ch[i] == T.ch[j]){
			i++; j++;
		}
		else{
			i = n + 1; j = 1; n++;
		}
	}
	if ((j - 1) == T.length) printf("  t在s中的位置为%d\n",n);
	else printf("  s串中找不到与t匹配的串\n");
}

void Printfj(SString S){  //遍历输出j序号
	printf("         j    ");
	int i = 1;
	while (i<=S.length){
		printf("%d  ", i); i++;
	}
	printf("\n");
}

void Printft(SString S) {  //遍历分隔输出t串
	printf("      t[j]    ");
	int a = 1;
	while (a <= S.length){
		if (a < 10) {
			printf("%c  ", S.ch[a]);
			a++;
		}
		else {
			printf("%c   ", S.ch[a]);
			a++;
		}
	}
	printf("\n");
}

void Getnext(SString T,int next[]){  //得到next数组
	int i = 1, j = 0; next[1] = 0;
	while (i < T.length){
		if (j == 0 || T.ch[i] == T.ch[j]){
			
			++i; ++j; next[i] = j;
		}
		else j = next[j];
	}
}

void Printfnext_val(SString T, int next[]) {  //遍历输出next或nextval数组
	int i = 1;
	while (i <= T.length) {
		if (i >= 10) {
			printf("%d   ", next[i]); i++;
		}
		else {
			printf("%d  ", next[i]); i++;
		}
	}
	printf("\n");
}

void Getnextval(SString T, int next[],int nextval[])//得到nextval数组
{
	int j = 2; nextval[1] = 0;
	while (j <= T.length)
	{
		if (T.ch[j] != T.ch[next[j]]) {
			nextval[j] = next[j]; j++;
		}
		else {
			nextval[j] = nextval[next[j]]; j++;
		}
	}
}

int main()
{
	SString S, T;
	int next[MAXSIZE],nextval[MAXSIZE];
	InitSString(S);
	InitSString(T);
	printf("请输入串s:");
	Scanfs(S);
	printf("请输入串t:");
	Scanfs(T);
	printf("串s:");
	Printfs(S);
	printf("串t:");
	Printfs(T);
	printf("简单匹配算法:\n");
	JDPPSF(S, T);
	Printfj(T);
	Printft(T);
	Getnext(T, next);
	printf("   next[j]    ");
	Printfnext_val(T,next);
	Getnextval(T, next, nextval);
	printf("nextval[j]    ");
	Printfnext_val(T, nextval);
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值