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++
#include <bits/stdc++.h>
using namespace std;
int dfa = 0;
void start( char c)
{
if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
else
dfa = -1;
}
void state1( char c)
{
if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
void state2( char c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
void state3( char c)
{
if (c == 'b' )
dfa = 4;
else
dfa = -1;
}
void state4( char c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
void state5( char c)
{
if (c == 'b' )
dfa = 6;
else
dfa = -1;
}
void state6( char c)
{
if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
int isAccepted( char str[])
{
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;
}
int main()
{
char str[] = "aaabbb" ;
if (isAccepted(str))
cout << "\nACCEPTED\n" ;
else
cout << "NOT ACCEPTED\n" ;
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
int dfa = 0;
void start( char c)
{
if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
else
dfa = -1;
}
void state1( char c)
{
if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
void state2( char c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
void state3( char c)
{
if (c == 'b' )
dfa = 4;
else
dfa = -1;
}
void state4( char c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
void state5( char c)
{
if (c == 'b' )
dfa = 6;
else
dfa = -1;
}
void state6( char c)
{
if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
int isAccepted( char str[])
{
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;
}
int main()
{
char str[] = "aaabbb" ;
if (isAccepted(str))
printf ( "\nACCEPTED\n" );
else
printf ( "NOT ACCEPTED\n" );
return 0;
}
|
Java
class GFG {
static int dfa = 0 ;
static void start( char c)
{
if (c == 'a' ) {
dfa = 1 ;
}
else if (c == 'b' ) {
dfa = 2 ;
}
else {
dfa = - 1 ;
}
}
static void state1( char c)
{
if (c == 'a' ) {
dfa = 0 ;
}
else if (c == 'b' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static void state2( char c)
{
if (c == 'b' ) {
dfa = 3 ;
}
else {
dfa = - 1 ;
}
}
static void state3( char c)
{
if (c == 'b' ) {
dfa = 4 ;
}
else {
dfa = - 1 ;
}
}
static void state4( char c)
{
if (c == 'b' ) {
dfa = 3 ;
}
else {
dfa = - 1 ;
}
}
static void state5( char c)
{
if (c == 'b' ) {
dfa = 6 ;
}
else {
dfa = - 1 ;
}
}
static void state6( char c)
{
if (c == 'b' ) {
dfa = 5 ;
}
else {
dfa = - 1 ;
}
}
static int isAccepted( char str[])
{
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 ;
}
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
def start(c):
if (c = = 'a' ):
dfa = 1
elif (c = = 'b' ):
dfa = 2
else :
dfa = - 1
return dfa
def state1(c):
if (c = = 'a' ):
dfa = 0
elif (c = = 'b' ):
dfa = 5
else :
dfa = - 1
return dfa
def state2(c):
if (c = = 'b' ):
dfa = 3
else :
dfa = - 1
return dfa
def state3(c):
if (c = = 'b' ):
dfa = 4
else :
dfa = - 1
return dfa
def state4(c):
if (c = = 'b' ):
dfa = 3
else :
dfa = - 1
return dfa
def state5(c):
if (c = = 'b' ):
dfa = 6
else :
dfa = - 1
return dfa
def state6(c):
if (c = = 'b' ):
dfa = 5
else :
dfa = - 1
return dfa
def isAccepted(String):
l = len (String)
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
if __name__ = = "__main__" :
String = "aaabbb"
if (isAccepted(String)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
|
C#
using System;
class GFG
{
static int dfa = 0;
static void start( char c)
{
if (c == 'a' )
{
dfa = 1;
}
else if (c == 'b' )
{
dfa = 2;
}
else
{
dfa = -1;
}
}
static void state1( char c)
{
if (c == 'a' )
{
dfa = 0;
}
else if (c == 'b' )
{
dfa = 5;
}
else
{
dfa = -1;
}
}
static void state2( char c)
{
if (c == 'b' )
{
dfa = 3;
}
else
{
dfa = -1;
}
}
static void state3( char c)
{
if (c == 'b' )
{
dfa = 4;
}
else
{
dfa = -1;
}
}
static void state4( char c)
{
if (c == 'b' )
{
dfa = 3;
}
else
{
dfa = -1;
}
}
static void state5( char c)
{
if (c == 'b' )
{
dfa = 6;
}
else
{
dfa = -1;
}
}
static void state6( char c)
{
if (c == 'b' )
{
dfa = 5;
}
else
{
dfa = -1;
}
}
static int isAccepted( char []str)
{
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;
}
public static void Main(String[] args)
{
char []str = "aaabbb" .ToCharArray();
if (isAccepted(str) == 1)
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
}
|
PHP
<?php
function start( $c , & $dfa )
{
if ( $c == 'a' ) $dfa = 1;
elseif ( $c == 'b' ) $dfa = 2;
else $dfa = -1;
}
function state1( $c , & $dfa )
{
if ( $c == 'a' ) $dfa = 0;
elseif ( $c == 'b' ) $dfa = 5;
else $dfa = -1;
}
function state2( $c , & $dfa )
{
if ( $c == 'b' ) $dfa = 3;
else $dfa = -1;
}
function state3( $c , & $dfa )
{
if ( $c == 'b' ) $dfa = 4;
else $dfa = -1;
}
function state4( $c , & $dfa )
{
if ( $c == 'b' ) $dfa = 3;
else $dfa = -1;
}
function state5( $c , & $dfa )
{
if ( $c == 'b' ) $dfa = 6;
else $dfa = -1;
}
function state6( $c , & $dfa )
{
if ( $c == 'b' ) $dfa = 5;
else $dfa = -1;
}
function isAccepted( $str , & $dfa )
{
$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;
}
$dfa = 0;
$str = array ( "a" , "a" , "a" , "b" , "b" , "b" );
if (isAccepted( $str , $dfa ) != 0)
echo "ACCEPTED" ;
else
echo "NOT ACCEPTED" ;
?>
|
Javascript
<script>
var dfa = 0;
function start(c)
{
if (c == 'a' )
dfa = 1;
else if (c == 'b' )
dfa = 2;
else
dfa = -1;
}
function state1(c)
{
if (c == 'a' )
dfa = 0;
else if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
function state2(c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
function state3(c)
{
if (c == 'b' )
dfa = 4;
else
dfa = -1;
}
function state4(c)
{
if (c == 'b' )
dfa = 3;
else
dfa = -1;
}
function state5(c)
{
if (c == 'b' )
dfa = 6;
else
dfa = -1;
}
function state6(c)
{
if (c == 'b' )
dfa = 5;
else
dfa = -1;
}
function isAccepted(str)
{
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;
}
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.
Level Up Your GATE Prep!
Embark on a transformative journey towards GATE success by choosing
Data Science & AI as your second paper choice with our specialized course. If you find yourself lost in the vast landscape of the GATE syllabus, our program is the compass you need.
Last Updated :
20 Dec, 2022
Like Article
Save Article