Skip to content
Related Articles

Related Articles

Improve Article

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

  • Last Updated : 29 May, 2021

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

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :