字符串匹配--DFA

目录

 

1.何为DFA?

2.要求

3.代码

4.代码解析

要求

思路

所有情况


1.何为DFA?

DFA:Deterministic Finite Automaton。汉译即,确定性有限自动机。是人们赋予给他的一个名字而已。

原理:首先设置初态,每达到匹配条件的一部分,就给他赋值,直到完全达到匹配的要求。

2.要求

检索字符串“dsbafabjijijcudidcwcudhe”中是否存在 ab*cd,这样的子字符串。(其中*可以是任意一个或者几个字符)

3.代码

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


int now_state=0;
			

 void checkStr(char* str)
 {
 	int size=strlen(str );
 	for(int i=0;i<size;i++)
 	{
 		//遇见'a' 
	 	if(now_state==0&&str[i]=='a')
	 	{
	 		now_state=1;
	 	}
	 	//遇见'b',并且前一个元素为'a' 
		 else if(now_state==1&&str[i]=='b'&&str[i-1]=='a')
	 	{
	 		now_state=2;
	 	}
	 	//'a' 'b' 后没遇到'c' 
	 	else if(now_state==2&&str[i]!='c')
	 	{
	 		now_state=2;
	 	}
	 	//遇到'c' 
	 	else if(now_state==2&&str[i]=='c')
	 	{
	 		now_state=3;
	 	}
	 	//遇到'd',并且前一个元素为'c' 
	 	else if(now_state==3&&str[i]=='d'&&str[i-1]=='c')
	 	{
	 		now_state=4;//i=size;//可加可不加,此为跳出循环
	 	}
	 }
 }
 int main()
 {
 	char* str="dsbafabjijijcudidcwcudhe";
 	checkStr(str ) ;
 	if(now_state==4)
 	{
	 	printf("存在ab*cd\n");
	 }else
	 {
 		printf("不存在ab*cd\n");
 	}
 	return 0;
 }

 

4.代码解析

 

要求

匹配ab*cd

思路

首先设置全局变量,来储存“匹配进度”。初始状态为“0”;

利用遍历的方式,列出所有可能的情况,模拟匹配的过程。

所有情况

1. 若进度==0,并且此时字符为a----->进度+1  --->1(正式开始匹配)

2. 若进度==1,并且此时字符为b,并且前一位是a------>进度+1--->2

否则进度+0--->1;

3. 若进度==2,并且此时字符为不为c----->进度+0--->2

4.  若进度==2,并且此时字符为为c----->进度+1--->3

5.若进度==3,并且此时字符为d,并且前一位是c------>进度+1--->4

否则进度+0--->3

6. 当状态为4时,可以结束循环;因为我只想知道是否存在ab*cd而已,无需全部遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Larry Chow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值