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:
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:
// 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 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 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# 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 |
<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> |
Not Accepted
Time Complexity: O(N)
Auxiliary Space: O(N)