为输入 (a,b) 的长度不小于 4 的游程实施 DFA
DFA 或确定性有限自动机是一种有限状态机,其中在每个输入字母表上,根据字符串接受的需要,根据一组定义的规则从一个状态转换到另一个状态。
在这个特殊的问题中,长度是要考虑的因素。输入字母是{a,b}。没有长度小于 4 的运行意味着任何输入字母至少重复 4 次。
例子:
Input: n = “aaabab”
Output: string not accepted
Explanation: The starting letter a is not repeated at least 4 times. Hence DFA failed.
Input: n = “aaaabbbbaaaabbbbbaaaaa”
Output: string accepted
Explanation: Every unique occurrence of a and b are repeated at least 4 times. Hence DFA passed.
逐步设计 DFA:
Step-1:首先我们要考虑输入的是什么输入字母。因为这大约是至少 4 次运行的长度。在状态“A”上输入字母为“a”并将该状态标记为初始状态。输入“a”发生以下转换:
- 从状态“A”到状态“B”
- 从状态“B”到状态“C”
- 从状态“C”到状态“D”
- 从状态“D”到状态“E”
步骤2:如上述步骤,输入最少4 个可接受的a,因此使状态“E”为最终状态。长度超过 4 的运行也是可以接受的,因此将“a”的自循环放在最终状态“E”上。
Step-3:到目前为止,机器设计是通过输入字母'a'完成的。但是状态“A”的输入字母'b'需要处理。现在对状态“A”上的输入字母“b”执行相同的过程。在输入“b”上发生以下转换:
- 从状态“A”到状态“F”
- 从状态“F”到状态“G”
- 从状态“G”到状态“H”
- 从状态“H”到状态“Q”
将状态“Q”标记为最终状态。并且长度超过 4 的运行也是可以接受的,因此将自循环置于最终状态“Q”。
Step-4:到目前为止,我们只处理了单个输入 a 或 b,即 aaaa 和 bbbb,但现在处理两个输入,例如 aaaabbbb 或 aaaabbbbaaaaa 等。
对于输入“b”从状态“E”到状态“F”的转换以及输入“a”从状态“Q”到状态“B”的转换。
Step-5:现在处理剩余的输入字母,到目前为止,设计的机器已经涵盖了所有可能的可接受情况,并且剩余的输入字母也不会进入死状态“DS”。
上述DFA的转换表:
这里“A”是初始状态,“E”和“Q”是最终状态。 DS被称为死亡状态
上述 DFA 的Python实现:
Python3
def checkStateA(n):
# if length of is 0
# print string not accepted
if(len(n)== 0):
print("string not accepted")
else:
# if 'a' is found
# call stateB function
# else call stateF
# function
if(n[0]=='a'):
stateB(n[1:])
else:
stateF(n[1:])
def stateB(n):
# if length of is 0
# print string not accepted
if (len(n)== 0):
print("string not accepted")
else:
# if 'a' is found
# call stateC function
# print string not
# accepted
if(n[0]=='a'):
stateC(n[1:])
else:
print("string not accepted")
def stateC(n):
# if length of is 0
# print string not accepted
if (len(n)== 0):
print("string not accepted")
else:
# if 'a' is found
# call stateD function
# print string not
# accepted
if(n[0]=='a'):
stateD(n[1:])
else:
print("string not accepted")
def stateD(n):
# if length of is 0
# print string not accepted
if(len(n)== 0):
print("string not accepted")
else:
# if 'a' is found
# call stateE function
# print string not
# accepted
if(n[0]=='a'):
stateE(n[1:])
else:
print("string not accepted")
def stateE(n):
# if length of is 0
# print string accepted
if(len(n)== 0):
print("string accepted")
# if 'a' is found
# call stateE function
# if 'b' is found
# call stateF function
elif(n[0]=='a'):
stateE(n[1:])
elif(n[0]=='b'):
stateF(n[1:])
def stateF(n):
# if length of is 0
# print string not accepted
if(len(n)== 0):
print("string not accepteed")
else:
# if 'b' is found
# call stateG function
# print string not
# accepted
if(n[0]=='b'):
stateG(n[1:])
else:
print("string not accepted")
def stateG(n):
# if length of is 0
# print string not accepted
if(len(n)== 0):
print("string not accepteed")
else:
# if 'b' is found
# call stateHfunction
# print string not
# accepted
if(n[0]=='b'):
stateH(n[1:])
else:
print("string not accepted")
def stateH(n):
# if length of is 0
# print string not accepted
if(len(n)== 0):
print("string not accepteed")
else:
# if 'b' is found
# call stateQ function
# print string not
# accepted
if(n[0]=='b'):
stateQ(n[1:])
else:
print("string not accepted")
def stateQ(n):
# if length of is 0
# print string accepted
if(len(n)== 0):
print("string accepteed")
else:
# if 'b' is found
# call stateQ function
# else call stateB function
if(n[0]=='b'):
stateQ(n[1:])
elif(n[0]=='a'):
stateB(n[1:])
# Driver code
if __name__ == '__main__':
# input string 1
n ="aaaabbbbbaaaa"
# function call to check the string
checkStateA(n)
# input string 2
n ="aaaabbb"
# function call to check the string
checkStateA(n)
string accepted
string not accepteed