DFA that begins with ‘a’ but does not contain substring ‘aab’
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++
// 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> |
Not Accepted
Time Complexity: O(N)
Auxiliary Space: O(N)
Please Login to comment...