DFA that begins with 'a' but does not contain substring 'aab'

Last Updated : 15 Jul, 2025

Prerequisite: Introduction to Deterministic Finite Automata 
Construct a DFA that accepts 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 the 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: 
 

STATEINPUT (a)INPUT (b)
---> AB*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: 

C++
// C++ code for the above DFA
#include <bits/stdc++.h>
using namespace std;
void stateQ(string);
void stateA(string);
void stateB(string);
void stateC(string);
void stateD(string);

// Function for state Q 
// transition
void stateQ(string n)
{
  // In dead state
  // it shows string
  // not accepted
  cout << ("Not Accepted");
}

// Function for state A 
// transition
void stateA(string n)
{
  // If at index 0
  // 'a' if found then
  // call stateB function
  // with passing n[1:] to it
  if (n[0] == 'a')
    stateB(n.substr(
           1, n.length() + 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
void stateB(string n)
{
  // Length of string
  // become 0 then
  // print Accepted
  if (n.length() == 0)
    cout << ("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.substr(
             1, n.length() - 1));

    // If at index 0
    // 'b' if found then
    // call stateD function
    // with passing n[1:] to it
    else
      stateD(n.substr(
             1, n.length() - 1));
  }
}

// Function for state C 
// transition
void stateC(string n)
{
  // Length of string
  // become 0 then
  // print Accepted
  if (n.length() == 0)
    cout << ("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.substr(
             1, n.length() + 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
void stateD(string n)
{
  // Length of string
  // become 0 then
  // print Accepted
  if (n.length() == 0)
    cout << ("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.substr(
             1, n.length() + 1));

    // If at index 0
    // 'b' if found then
    // call stateD function
    // with passing n[1:] to it
    else
      stateD(n.substr(
             1, n.length() + 1));
  }
}

// Driver code
int main()
{
  // Take string input
  string n = "aaaba";

  // Call stateA to check 
  // the input
  stateA(n);
}

// This code is contributed by Chitranayal
Java
// Java code for the 
// above DFA
import java.util.*;

class GFG{
     
// Function for state 
// A transition    
static void stateA(String n)
{
  
  // If at index 0
  // 'a' if found then
  // call stateB function
  // with passing n[1:] to it
  if (n.charAt(0) == 'a')
  {
    stateB(n.substring(1));
  }
  
  // If at index 0
  // 'b' if found then
  // call stateQ function
  // with passing n to it    
  else
  {
    stateQ(n);   
  }
}
  
// Function for transition 
// state B         
static void stateB(String n)
{
  
  // length() of String 
  // become 0 then 
  // print Accepted
  if (n.length() == 0)
  {
    System.out.print("Accepted");
  }
  else
  {
    
    // If at index 0
    // 'a' if found then
    // call stateC function
    // with passing n[1:] to it
    if (n.charAt(0) == 'a')
      stateC(n.substring(1));
 
    // If at index 0
    // 'b' if found then
    // call stateD function
    // with passing n[1:] to it 
    else
      stateD(n.substring(1));
  }     
} 
 
// Function for transition 
// state C 
static void stateC(String n)
{
  
  // length() of String 
  // become 0 then 
  // print Accepted
  if (n.length() == 0)
    System.out.print("Accepted");
  else
  {
    
    // If at index 0
    // 'a' if found then
    // call stateC function
    // with passing n[1:] to it
    if (n.charAt(0) == 'a')
      stateC(n.substring(1));
 
    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
      stateQ(n);
  }
}
 
// Function for transition 
// state D
static void stateD(String n)
{
  
  // length() of String 
  // become 0 then 
  // print Accepted
  if (n.length() == 0)
    System.out.print("Accepted");
  else
  {
    
    // If at index 0
    // 'a' if found then
    // call stateC function
    // with passing n[1:] to it
    if (n.charAt(0) == 'a')
    {
      stateB(n.substring(1));
    }
 
    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
    {
      stateD(n.substring(1));
    }
  }
}
 
// Function for state Q 
// transition
static void stateQ(String n)
{
  
  // In dead state 
  // it shows String 
  // not accepted
  System.out.print("Not Accepted");
}
     
// Driver code
public static void main(String []args)
{
  
  // Take String input
  String n ="aaaba";
  
  // Call stateA to check the input
  stateA(n);
}
}

// This code is contributed by pratham76
Python3
# Python3 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)
C#
// C# code for the 
// above DFA
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
    
// Function for state 
// A transition    
static void stateA(string n)
{
  // If at index 0
  // 'a' if found then
  // call stateB function
  // with passing n[1:] to it
  if (n[0] == 'a')
  {
    stateB(n.Substring(1));
  }


  // If at index 0
  // 'b' if found then
  // call stateQ function
  // with passing n to it    
  else
  {
    stateQ(n);   
  }
}
 
// Function for transition 
// state B         
static void stateB(string n)
{
  // Length of string 
  // become 0 then 
  // print Accepted
  if (n.Length == 0)
  {
    Console.Write("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.Substring(1));

    // If at index 0
    // 'b' if found then
    // call stateD function
    // with passing n[1:] to it 
    else
      stateD(n.Substring(1));
  }     
} 

// Function for transition 
// state C 
static void stateC(string n)
{
  // Length of string 
  // become 0 then 
  // print Accepted
  if (n.Length == 0)
    Console.Write("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.Substring(1));

    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
      stateQ(n);
  }
}

// Function for transition 
// state D
static void stateD(string n)
{
  // Length of string 
  // become 0 then 
  // print Accepted
  if (n.Length == 0)
    Console.Write("Accepted");
  else
  {
    // If at index 0
    // 'a' if found then
    // call stateC function
    // with passing n[1:] to it
    if (n[0] == 'a')
    {
      stateB(n.Substring(1));
    }

    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
    {
      stateD(n.Substring(1));
    }

  }
}

// Function for state Q 
// transition
static void stateQ(string n)
{
  // In dead state 
  // it shows string 
  // not accepted
  Console.Write("Not Accepted");
}
    
// Driver code
public static void Main(string []args)
{
  // Take string input
  string n ="aaaba";

  // Call stateA to check the input
  stateA(n);
}
}

// This code is contributed by rutvik_56
JavaScript
<script>

// JavaScript program to implement
// the above approach
 
// Function for state
// A transition   
function 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.substr(1));
  }
   
  // If at index 0
  // 'b' if found then
  // call stateQ function
  // with passing n to it   
  else
  {
    stateQ(n);  
  }
}
   
// Function for transition
// state B        
function stateB(n)
{
   
  // length() of String
  // become 0 then
  // print Accepted
  if (n.length == 0)
  {
    document.write("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.substr(1));
  
    // If at index 0
    // 'b' if found then
    // call stateD function
    // with passing n[1:] to it
    else
      stateD(n.substr(1));
  }    
}
  
// Function for transition
// state C
function stateC(n)
{
   
  // length() of String
  // become 0 then
  // print Accepted
  if (n.length == 0)
    document.write("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.substr(1));
  
    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
      stateQ(n);
  }
}
  
// Function for transition
// state D
function stateD(n)
{
   
  // length() of String
  // become 0 then
  // print Accepted
  if (n.length() == 0)
    document.write("Accepted");
  else
  {
     
    // If at index 0
    // 'a' if found then
    // call stateC function
    // with passing n[1:] to it
    if (n[0] == 'a')
    {
      stateB(n.substr(1));
    }
  
    // If at index 0
    // 'b' if found then
    // call stateQ function
    // with passing n to it
    else
    {
      stateD(n.substr(1));
    }
  }
}
  
// Function for state Q
// transition
function stateQ(n)
{
   
  // In dead state
  // it shows String
  // not accepted
  document.write("Not Accepted");
}

// Driver code

    // Take String input
  let n ="aaaba";
   
  // Call stateA to check the input
  stateA(n);
  
  // This code is contributed by sanjoy_62.
</script>

Output: 
Not Accepted

 

Time Complexity: O(N)  
Auxiliary Space: O(N)

Comment