阿里云笔试题:正则表达式和有限状态自动机

根据正则表达式画出有限状态自动机。

 

参考:http://blog.csdn.net/crackcell/archive/2008/04/07/2256758.aspx

1、概念

字母表中的符号组成的有限长度的序列。记号s的长度记为|s|。长度为0的记号称为空记号,记为ε

非确定有限自动机(Nondeterministic Finite Automaton)NFA

确定有限自动机(Deterministic Finite Automaton)DFA

DFA是NFA的一种特例,有两点约束:

(1)对于空输入,状态不发生转移

(2)对于每一种输入最多只有一种状态转移

2、将正则表达式转换为NFA

令正则表达式s和t的NFA分别为N(s)和N(t),对于常见的正则表达式有如下转换方式:

a) 对于s|t,按照以下的方式生成NFA N(s|t)3、将NFA转化为DFA

fig03.png

b) 对于st,按照以下的方式生成NFA N(st)

fig04.png

c) 对于s*,按照以下的方式生成NFA N(s*)

fig05.png

d)对于s+,只需要在s*的基础上去除i->f的空输入转移

示例,根据正则表达式r=(a|b)*abb 可以生成以下的NFA。

fig06.png

3、将NFA转换为DFA

ε-closure(s)表示从NFA的状态s出发,仅通过ε迁移能够到达的NFA的状态集合。

直接看示例转换过程如下:最初,Dstates内仅有A = {0, 1, 2, 4, 7}。然后对于状态A,对于输入记号a,计算 ε-closure(move(A, a)) = ε-closure(move({0, 1, 2, 4, 7}, a)) = ε-closure({3, 8}) = {1, 2, 3, 4, 6, 7, 8},即 B={1, 2, 3, 4, 6, 7, 8}, Dtran[A, a]=B。对于状态A,由输入记号b能够到达的仅有4->5,因此 C = ε-closure({5}) = {1, 2, 4, 5, 6, 7},即 Dtran[A, b] = C

以此类推,可得到以下的状态和Dtran(状态转移表)。

A = {0, 1, 2, 4, 7}
D = {1, 2, 4, 5, 6, 7, 9}
B = {1, 2, 3, 4, 6, 7, 8}
E = {1, 2, 4, 5, 6, 7, 10}
C = {1, 2, 4, 5, 6, 7}

 状态转移表Dtran

状态  输入符号
ab
ABC
BBD
CBC
DBE
EBC

由此得出DFA如下图所示。

fig07.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值