阿非确定性有限自动机是一个有限状态机,其中一个元组被映射到多个状态。就是 我们用另一个函数Δ :Q × Σ → P(Q )代替DFA的常规δ :Q × Σ → Q转换函数。
如果您知道什么是NFA,则可能要跳过下一部分。
正式定义
NFA的唯一描述是
- 有限状态集
- 一组有限的符号
- 跃迁函数
- 的初始状态
- 一组最终状态
该机在开出和读取符号的有限串w ^ ∈ Σ *,每个符号将同时与当前状态应用转换函数功能,每一个新的状态集添加到组当前状态。
挑战
对于此挑战,我们将忽略来简化它,此外,对于某些非负整数N,字母始终是(小写的)字母a到z,状态集将是{ 0 … N }。初始状态将始终为0。
给定一个词和NFA的描述,你的任务是确定所有的最终状态。
例
考虑字符串和以下描述:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
机器将从:
- 读:新状态{ 1 }
- 读取:新的状态{ 1 ,2 }
- 读取:新状态{ 0 }
- 读:新状态{ 1 }
- 读取:新的状态{ 1 ,2 }
因此,最终状态,因此输出将是。
注意:在步骤(2)中,状态映射映射到∅,因为描述仅包括到非空集的转换。
规则
输入将包含一个字符串和NFA的某种描述(无 -transitions):
- 输入字符串将始终是{ a … z } ∗的元素
- 有效输入(不限于):
- 元组/列表的列表/数组
- 新行分隔输入
- NFA的说明将仅包含带有非空集的过渡
- 如果结果相同,则可以使用相同字符的规则缩写(例如,规则,
0,'a',[1,2]
并且0,'b',[1,2]
可以缩写为0,"ab",[1,2]
- 您可以将每个规则分开(例如rule
0,'a',[1,2]
可以是0,'a',[1]
和0,'a',[2]
)
- 如果结果相同,则可以使用相同字符的规则缩写(例如,规则,
- 您可以根据需要选择大写字母
- 您可以将状态数作为输入
- 您可以假设输入的某种排序(例如,按状态或符号排序)
输出将是最终状态的列表/集合/换行分隔的输出等。
- 顺序没关系
- 没有重复(因为它是一组)
测试用例
这些示例的格式为description word -> states
where description
是元组列表(state,symbol,new-states)
:
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]