DFA that begins with ‘a’ but does not contain substring ‘aab’

Prerequisite: Introduction to Deterministic Finite Automata
Construct a DFA that accepts a string str starting with input alphabet ‘a’ but does not contain ‘aab’ as a substring over input {a, b}.

Examples:

Input: str = “babba”
Output: Not Accepted
Explanation:
The given string doesn’t start with ‘a’.

Input: str = “abbaaaaa”
Output: Accepted
Explanation:
The given string start with ‘a’and doesn’t contains “aab” as a substring.

Approach:
The transition table helps to understand how the transition of each state takes place on the input alphabets. In transition table initial state is represented by —> and the final state is represented by *. There are 3 final states, one initial and one dead state.



State Transition table of the given DFA:

STATE INPUT (a) INPUT (b)
—> A B* Q (dead state)
B* C* D*
C* C* Q (dead state)
D* B* D*
Q (dead state) Q (dead state) Q (dead State)

Below is the DFA diagram:

Below is the implementation of the above DFA:

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python code for the above DFA
  
# Function for state A transition
def stateA(n):
      
    # If at index 0
    # 'a' if found then
    # call stateB function
    # with passing n[1:] to it
    if (n[0]=='a'):
        stateB(n[1:])
          
    # If at index 0
    # 'b' if found then
    # call stateQ function
    # with passing n to it    
    else:
        stateQ(n)
  
# Function for state B transition
def stateB(n):
      
    # Length of string 
    # become 0 then 
    # print Accepted
    if(len(n)== 0):
        print("Accepted")
    else:    
        # If at index 0
        # 'a' if found then
        # call stateC function
        # with passing n[1:] to it
        if (n[0]=='a'):
            stateC(n[1:])
              
        # If at index 0
        # 'b' if found then
        # call stateD function
        # with passing n[1:] to it    
        else:
            stateD(n[1:])
  
# Function for state C transition
def stateC(n):   
      
    # Length of string 
    # become 0 then 
    # print Accepted
    if(len(n)== 0):
        print("Accepted")
          
    else
        # If at index 0
        # 'a' if found then
        # call stateC function
        # with passing n[1:] to it
        if (n[0]=='a'):
            stateC(n[1:])
              
        # If at index 0
        # 'b' if found then
        # call stateQ function
        # with passing n to it    
        else:
            stateQ(n)
  
# Function for state D transition
def stateD(n):
      
    # Length of string 
    # become 0 then 
    # print Accepted
    if(len(n)== 0):
        print("Accepted")
          
    else:    
        # If at index 0
        # 'a' if found then
        # call stateB function
        # with passing n[1:] to it
        if (n[0]=='a'):
            stateB(n[1:])
              
        # If at index 0
        # 'b' if found then
        # call stateD function
        # with passing n[1:] to it    
        else:
            stateD(n[1:])
             
# Function for state Q transition
def stateQ(n):
    # In dead state 
    # it shows string 
    # not accepted
    print("Not Accepted")
      
# Take string input
n ="aaaba"
  
# Call stateA to check the input
stateA(n)

chevron_right


Output:

Not Accepted

Attention reader! Don’t stop learning now. Get hold of all the important CS Theory concepts for SDE interviews with the CS Theory Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.