目录
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而已,无需全部遍历。