Design a deterministic finite automata(DFA) for accepting the language L =
For creating DFA for language, L = { a^n b^m ; n+m=even } use elementary mathematics, which says-
even + even = even and odd + odd = even
Examples:
Input: a a b b // n = 2, m = 2, 2 + 2 = 4 (even) Output: ACCEPTED Input: a a a b b b b // n = 3, m = 4, 3 + 4 = 7 (odd) Output: NOT ACCEPTED Input: a a a b b b // n = 3, m = 3, 3 + 3 = 6 (even) Output: ACCEPTED
Approaches:
There is 2 cases that results in acceptance of string:
- If both n and m are even then their sum will be even
- If both n and m are odd then their sum will be even
Description:
Given DFA has 2 parts. The first part consists of states 0, 1, 5, and 6 which is for both n and m is odd. The second part consists of states 2, 3, and 4 is for both n and m is even.
DFA State Transition Diagram:
Let’s see the code for the demonstration:
// C++ program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } #include <bits/stdc++.h> using namespace std;
// dfa tells the number associated // with the present state int dfa = 0;
// This function is for // the starting state (zeroth) of DFA void start( char c)
{ if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
// -1 is used to check for any invalid symbol
else
dfa = -1;
} // This function is for the first state of DFA void state1( char c)
{ if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
} // This function is for the second state of DFA void state2( char c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the third state of DFA void state3( char c)
{ if (c == 'b' )
dfa = 4;
else
dfa = -1;
} // This function is for the fourth state of DFA void state4( char c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the fifth state of DFA void state5( char c)
{ if (c == 'b' )
dfa = 6;
else
dfa = -1;
} // This function is for the sixth state of DFA void state6( char c)
{ if (c == 'b' )
dfa = 5;
else
dfa = -1;
} int isAccepted( char str[])
{ // Store length of string
int i, len = strlen (str);
for (i = 0; i < len; i++) {
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state1(str[i]);
else if (dfa == 2)
state2(str[i]);
else if (dfa == 3)
state3(str[i]);
else if (dfa == 4)
state4(str[i]);
else if (dfa == 5)
state5(str[i]);
else if (dfa == 6)
state6(str[i]);
else
return 0;
}
if (dfa == 3 || dfa == 5)
return 1;
else
return 0;
} // Driver code int main()
{ char str[] = "aaabbb" ;
if (isAccepted(str))
cout << "\nACCEPTED\n" ;
else
cout << "NOT ACCEPTED\n" ;
return 0;
} // This code is contributed by SHUBHAMSINGH10 |
// C program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } #include <stdio.h> #include <string.h> // dfa tells the number associated // with the present state int dfa = 0;
// This function is for // the starting state (zeroth) of DFA void start( char c)
{ if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
// -1 is used to check for any invalid symbol
else
dfa = -1;
} // This function is for the first state of DFA void state1( char c)
{ if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
} // This function is for the second state of DFA void state2( char c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the third state of DFA void state3( char c)
{ if (c == 'b' )
dfa = 4;
else
dfa = -1;
} // This function is for the fourth state of DFA void state4( char c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the fifth state of DFA void state5( char c)
{ if (c == 'b' )
dfa = 6;
else
dfa = -1;
} // This function is for the sixth state of DFA void state6( char c)
{ if (c == 'b' )
dfa = 5;
else
dfa = -1;
} int isAccepted( char str[])
{ // store length of string
int i, len = strlen (str);
for (i = 0; i < len; i++) {
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state1(str[i]);
else if (dfa == 2)
state2(str[i]);
else if (dfa == 3)
state3(str[i]);
else if (dfa == 4)
state4(str[i]);
else if (dfa == 5)
state5(str[i]);
else if (dfa == 6)
state6(str[i]);
else
return 0;
}
if (dfa == 3 || dfa == 5)
return 1;
else
return 0;
} // driver code int main()
{ char str[] = "aaabbb" ;
if (isAccepted(str))
printf ( "\nACCEPTED\n" );
else
printf ( "NOT ACCEPTED\n" );
return 0;
} |
// Java program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } class GFG {
// dfa tells the number associated
// with the present state.
static int dfa = 0 ;
// This function is for
// the starting state (Q0)of DFA
static void start( char c)
{
if (c == 'a' ) {
dfa = 1 ;
}
else if (c == 'b' ) {
dfa = 2 ;
}
// -1 is used to check for any invalid symbol
else {
dfa = - 1 ;
}
}
// This function is for
// the first state (Q1) of DFA
static void state1( char c)
{
if (c == 'a' ) {
dfa = 0 ;
}
else if (c == 'b' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
// This function is for the
// second state (Q2) of DFA
static void state2( char c)
{
if (c == 'b' ) {
dfa = 3 ;
}
else {
dfa = - 1 ;
}
}
// This function is for the
// third state (Q3)of DFA
static void state3( char c)
{
if (c == 'b' ) {
dfa = 4 ;
}
else {
dfa = - 1 ;
}
}
// This function is for the
// fourth state (Q4) of DFA
static void state4( char c)
{
if (c == 'b' ) {
dfa = 3 ;
}
else {
dfa = - 1 ;
}
}
// This function is for the
// fifth state (Q5) of DFA
static void state5( char c)
{
if (c == 'b' ) {
dfa = 6 ;
}
else {
dfa = - 1 ;
}
}
// This function is for the
// sixth state (Q6) of DFA
static void state6( char c)
{
if (c == 'b' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static int isAccepted( char str[])
{
// store length of string
int i, len = str.length;
for (i = 0 ; i < len; i++) {
if (dfa == 0 )
start(str[i]);
else if (dfa == 1 )
state1(str[i]);
else if (dfa == 2 )
state2(str[i]);
else if (dfa == 3 )
state3(str[i]);
else if (dfa == 4 )
state4(str[i]);
else if (dfa == 5 )
state5(str[i]);
else if (dfa == 6 )
state6(str[i]);
else
return 0 ;
}
if (dfa == 3 || dfa == 5 )
return 1 ;
else
return 0 ;
}
// Driver code
public static void main(String[] args)
{
char str[] = "aaabbb" .toCharArray();
if (isAccepted(str) == 1 )
System.out.println( "ACCEPTED" );
else
System.out.println( "NOT ACCEPTED" );
}
} |
# Python3 program to implement DFA that accepts # all strings which follow the language # L = a ^ n b ^ m n + m = even # This function is for the dfa = starting # dfa = state (zeroth) of DFA def start(c):
if (c = = 'a' ):
dfa = 1
elif (c = = 'b' ):
dfa = 2
# -1 is used to check for any
# invalid symbol
else :
dfa = - 1
return dfa
# This function is for the first # dfa = state of DFA def state1(c):
if (c = = 'a' ):
dfa = 0
elif (c = = 'b' ):
dfa = 5
else :
dfa = - 1
return dfa
# This function is for the second # dfa = state of DFA def state2(c):
if (c = = 'b' ):
dfa = 3
else :
dfa = - 1
return dfa
# This function is for the third # dfa = state of DFA def state3(c):
if (c = = 'b' ):
dfa = 4
else :
dfa = - 1
return dfa
# This function is for the fourth # dfa = state of DFA def state4(c):
if (c = = 'b' ):
dfa = 3
else :
dfa = - 1
return dfa
# This function is for the fifth # dfa = state of DFA def state5(c):
if (c = = 'b' ):
dfa = 6
else :
dfa = - 1
return dfa
# This function is for the sixth # dfa = state of DFA def state6(c):
if (c = = 'b' ):
dfa = 5
else :
dfa = - 1
return dfa
def isAccepted(String):
# store length of String
l = len (String)
# dfa tells the number associated
# with the present dfa = state
dfa = 0
for i in range (l):
if (dfa = = 0 ):
dfa = start(String[i])
elif (dfa = = 1 ):
dfa = state1(String[i])
elif (dfa = = 2 ) :
dfa = state2(String[i])
elif (dfa = = 3 ) :
dfa = state3(String[i])
elif (dfa = = 4 ) :
dfa = state4(String[i])
elif (dfa = = 5 ) :
dfa = state5(String[i])
elif (dfa = = 6 ):
dfa = state6(String[i])
else :
return 0
if (dfa = = 3 or dfa = = 5 ) :
return 1
else :
return 0
# Driver code if __name__ = = "__main__" :
String = "aaabbb"
if (isAccepted(String)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
# This code is contributed by # Shubham Singh(SHUBHAMSINGH10) |
// C# program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } using System;
class GFG
{ // dfa tells the number associated
// with the present state.
static int dfa = 0;
// This function is for
// the starting state (Q0)of DFA
static void start( char c)
{
if (c == 'a' )
{
dfa = 1;
}
else if (c == 'b' )
{
dfa = 2;
}
// -1 is used to check for any invalid symbol
else
{
dfa = -1;
}
}
// This function is for
// the first state (Q1) of DFA
static void state1( char c)
{
if (c == 'a' )
{
dfa = 0;
}
else if (c == 'b' )
{
dfa = 5;
}
else
{
dfa = -1;
}
}
// This function is for the
// second state (Q2) of DFA
static void state2( char c)
{
if (c == 'b' )
{
dfa = 3;
}
else
{
dfa = -1;
}
}
// This function is for the
// third state (Q3)of DFA
static void state3( char c)
{
if (c == 'b' )
{
dfa = 4;
}
else
{
dfa = -1;
}
}
// This function is for the
// fourth state (Q4) of DFA
static void state4( char c)
{
if (c == 'b' )
{
dfa = 3;
}
else
{
dfa = -1;
}
}
// This function is for the
// fifth state (Q5) of DFA
static void state5( char c)
{
if (c == 'b' )
{
dfa = 6;
}
else
{
dfa = -1;
}
}
// This function is for the
// sixth state (Q6) of DFA
static void state6( char c)
{
if (c == 'b' )
{
dfa = 5;
}
else
{
dfa = -1;
}
}
static int isAccepted( char []str)
{
// store length of string
int i, len = str.Length;
for (i = 0; i < len; i++)
{
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state1(str[i]);
else if (dfa == 2)
state2(str[i]);
else if (dfa == 3)
state3(str[i]);
else if (dfa == 4)
state4(str[i]);
else if (dfa == 5)
state5(str[i]);
else if (dfa == 6)
state6(str[i]);
else
return 0;
}
if (dfa == 3 || dfa == 5)
return 1;
else
return 0;
}
// Driver code
public static void Main(String[] args)
{
char []str = "aaabbb" .ToCharArray();
if (isAccepted(str) == 1)
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
} /* This code contributed by PrinciRaj1992 */ |
<?php // PHP program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } // This function is for the // starting state (zeroth) of DFA function start( $c , & $dfa )
{ if ( $c == 'a' ) $dfa = 1;
elseif ( $c == 'b' ) $dfa = 2;
// -1 is used to check for any
// invalid symbol
else $dfa = -1;
} // This function is for the first // state of DFA function state1( $c , & $dfa )
{ if ( $c == 'a' ) $dfa = 0;
elseif ( $c == 'b' ) $dfa = 5;
else $dfa = -1;
} // This function is for the second // state of DFA function state2( $c , & $dfa )
{ if ( $c == 'b' ) $dfa = 3;
else $dfa = -1;
} // This function is for the third // state of DFA function state3( $c , & $dfa )
{ if ( $c == 'b' ) $dfa = 4;
else $dfa = -1;
} // This function is for the fourth // state of DFA function state4( $c , & $dfa )
{ if ( $c == 'b' ) $dfa = 3;
else $dfa = -1;
} // This function is for the fifth // state of DFA function state5( $c , & $dfa )
{ if ( $c == 'b' ) $dfa = 6;
else $dfa = -1;
} // This function is for the sixth // state of DFA function state6( $c , & $dfa )
{ if ( $c == 'b' ) $dfa = 5;
else $dfa = -1;
} function isAccepted( $str , & $dfa )
{ // store length of string
$i = 0; $len = sizeof( $str );
for ( $i = 0; $i < $len ; $i ++)
{
if ( $dfa == 0)
start( $str [ $i ], $dfa );
elseif ( $dfa == 1)
state1( $str [ $i ], $dfa );
elseif ( $dfa == 2)
state2( $str [ $i ], $dfa );
elseif ( $dfa == 3)
state3( $str [ $i ], $dfa );
elseif ( $dfa == 4)
state4( $str [ $i ], $dfa );
elseif ( $dfa == 5)
state5( $str [ $i ], $dfa );
elseif ( $dfa == 6)
state6( $str [ $i ], $dfa );
else
return 0;
}
if ( $dfa == 3 || $dfa == 5)
return 1;
else
return 0;
} // Driver code // dfa tells the number associated // with the present state $dfa = 0;
$str = array ( "a" , "a" , "a" , "b" , "b" , "b" );
if (isAccepted( $str , $dfa ) != 0)
echo "ACCEPTED" ;
else echo "NOT ACCEPTED" ;
// This code is contributed by // Adesh kumar Singh(adeshsingh1) ?> |
<script> // Javascript program to implement DFA that accepts // all strings which follow the language // L = { a^n b^m ; n+m=even } // dfa tells the number associated // with the present state var dfa = 0;
// This function is for // the starting state (zeroth) of DFA function start(c)
{ if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
// -1 is used to check for any invalid symbol
else
dfa = -1;
} // This function is for the first state of DFA function state1(c)
{ if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
} // This function is for the second state of DFA function state2(c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the third state of DFA function state3(c)
{ if (c == 'b' )
dfa = 4;
else
dfa = -1;
} // This function is for the fourth state of DFA function state4(c)
{ if (c == 'b' )
dfa = 3;
else
dfa = -1;
} // This function is for the fifth state of DFA function state5(c)
{ if (c == 'b' )
dfa = 6;
else
dfa = -1;
} // This function is for the sixth state of DFA function state6(c)
{ if (c == 'b' )
dfa = 5;
else
dfa = -1;
} function isAccepted(str)
{ // Store length of string
var i, len = (str.length);
for (i = 0; i < len; i++) {
if (dfa == 0)
start(str[i]);
else if (dfa == 1)
state1(str[i]);
else if (dfa == 2)
state2(str[i]);
else if (dfa == 3)
state3(str[i]);
else if (dfa == 4)
state4(str[i]);
else if (dfa == 5)
state5(str[i]);
else if (dfa == 6)
state6(str[i]);
else
return 0;
}
if (dfa == 3 || dfa == 5)
return 1;
else
return 0;
} // Driver code var str = "aaabbb" ;
if (isAccepted(str))
document.write( "ACCEPTED" );
else document.write( "NOT ACCEPTED" );
</script> |
Output:
ACCEPTED
Time Complexity: O(n) where n is the length of the given string array
Auxiliary Space: O(1)
There is a minimal DFA for the same problem.