微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

包含 1011 作为子字符串的 DFA

如何解决包含 1011 作为子字符串的 DFA

我必须绘制一个 DFA,它接受包含 1011 的所有字符串集作为其中的子字符串。我试过了,但想不出一个。有人可以帮我吗?

谢谢

解决方法

执行此操作的 DFA 的想法很简单:跟踪到目前为止我们在输入的末尾看到了多少子字符串。如果您最终到达到目前为止看到的输入以该子字符串结尾的点,则您接受整个输入。如果您在看到以您的子字符串结尾的前缀之前到达输入的结尾,则您不接受。

我们可以通过添加必要的状态来创建 DFA,以表示与目标子字符串的不同匹配级别。所有 DFA 都至少需要一种状态:我们称之为 q0。

---->q0

您语言的隐含字母表是 {0,1},因此我们需要在状态 q0 上对这两个符号进行转换。让我们考虑一下在状态 q0 中我们会看到多少子串。我们可以使用空字符串到达​​ q0;也就是说,在消耗任何输入之前。看到空字符串后,我们看到了组成子字符串的四个符号中的零个。因此,q0 应该对应于“我到目前为止看到的输入以匹配目标子字符串的 0/4 的字符串结尾”的情况。

鉴于此,我们应该为 0 和 1 添加哪些转换?如果我们在状态 q0 中看到 0,那根本没有帮助,因为我们正在寻找的子字符串以 1 开头;因此,在 q0 中看到 0 不会改变我们迄今为止看到的输入与 0/4 符号匹配的事实。这意味着我们可以让从 q0 on 0 返回到 q0 的转换。

     /-\
   0 |  |
     V /
---->q0

如果我们在 q0 中看到 1 呢?好吧,如果我们看到一个 1,那么到目前为止我们看到的输入以一个字符串结束,该字符串在 1/4 的位置(第一个 1)与 1011 匹配;所以,我们需要另一个状态来表示我们离目标更近了一点。我们称这种状态为 q1。

     /-\
   0 |  |
     V /
---->q0---->q1
         1

我们现在对状态 q1 重复这个过程。如果我们在 q1 中看到 0,我们就更接近我们的目标 1011,所以我们可以进入一个新状态 q2。如果我们在 q1 中看到 1,我们就不会更接近我们的目标,但我们也不会后退。

      0      1
     /-\    /-\
     |  |   |  |
     V /    V /
---->q0---->q1---->q2
         1      0

如果我们在 q2 中看到 0,则表示我们已经看到了子字符串 00;这根本没有出现在 1011 中,这意味着我们完全回到了第一个并且必须返回到 q0。但是,如果我们看到 1,我们就离我们的目标更近了一点,必须转移到一个新的状态;我们称之为 q3:

      0      1
     /-\    /-\
     |  |   |  |
     V /    V /
---->q0---->q1---->q2---->q3
     ^   1      0  |   1
     |             |
     \-------------/
            0

如果我们在 q3 中看到 0,那么我们的输入以子串 10 结束,这使我们回到 q2;如果我们看到一个 1,那么我们已经看到了整个目标 1011,需要去一个新的状态来记住这个事实。

      0      1         0
     /-\    /-\    /------\
     |  |   |  |   |      |
     V /    V /    V      |
---->q0---->q1---->q2---->q3---->q4
     ^   1      0  |   1      1
     |             |
     \-------------/
            0

最后,在状态 q4 中,无论我们看到什么,我们都知道必须接受输入,因为我们已经在输入的某处看到了子字符串 1011。这意味着我们应该让 q4 接受并让两个转换都回到 q4:

      0      1         0          
     /-\    /-\    /------\       /---\
     | |    | |    |      |       |    | 
     V /    V /    V      |       V    | 0,1
---->q0---->q1---->q2---->q3---->[q4]--/
     ^   1      0  |   1      1
     |             |
     \-------------/
            0

您可以检查一些示例以说服自己此 DFA 接受您想要的语言。我们通过问自己转换必须去哪里来一次建立一个状态。当新的转换不再需要新状态时,我们停止添加新状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。