【问题标题】:DFA to represent a passwordDFA 表示密码
【发布时间】:2016-03-05 22:28:35
【问题描述】:
我想为具有以下约束的密码设计一个 DFA:
- 长度必须为 8 个字符
- 它必须至少包含两个小写字符:
[a-z]
- 必须至少包含一个大写字符:
[A-Z]
- 它必须至少包含两个十进制数字:
[0-9]
- 它必须至少包含以下特殊字符之一:
[!.@*_]
- 必须以特殊字符开头
如何设计此 DFA?
【问题讨论】:
标签:
computation-theory
dfa
【解决方案1】:
该语言的任何 DFA 至少需要记住
- 已读取了多少个小写字母(0、1 或 2 个或更多),
- 已读取多少个大写字母(0 个或 1 个或更多),以及
- 已读取多少个十进制数字(0、1 或 2 或更多)。
这至少为您提供了至少 18 个州,这甚至不考虑长度限制。我认为您不会为这种语言找到简单的 DFA。它会变得很大。
现在,您可以构建一个相当简单但庞大的 DFA,方法是为每个限制构建一个 DFA(这些都不是太糟糕),然后进行多路乘积构建来为整个语言构建一个 DFA。我认为这是理论上最优雅的方法,实际上很容易在软件中表示这一点。如果我必须实际构建 DFA,我会这样做。