Design a deterministic finite automata (DFA) for accepting the language
odd + even = odd, and even+odd = odd
Examples:
Input: a a b b b Output: ACCEPTED // n = 2, m = 3, 2 + 3 = 5 (odd) Input: a a a b b b Output: NOT ACCEPTED // n = 3, m = 3, 3 + 3 = 6 (even) Input: a a a a b b b Output: ACCEPTED // n = 4, m = 3, 4 + 3 = 7 (odd)
Approaches:
There are 2 cases that result in acceptance of string:
- If n is odd and m is even then their sum will be odd
- If n is even and m is odd then their sum will be odd
Description:
Given DFA has 2 parts. The first part consists of states 0, 1, 5, and 6 which is for n is odd and m is even. The second part consists of states 2, 3, and 4 for n is even and m is odd.
DFA State Transition Diagram:
Let’s see the code for the demonstration:
// C program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; n+m=odd } #include <stdio.h> #include <string.h> // dfa tells the number associated // string end in which state. int dfa = 0;
// This function is for // the starting state (Q0)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 (Q1) 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 (Q2) of DFA void state2( char c)
{ if (c == 'b' ) {
dfa = 3;
}
else {
dfa = -1;
}
} // This function is for the third state (Q3)of DFA void state3( char c)
{ if (c == 'b' ) {
dfa = 4;
}
else {
dfa = -1;
}
} // This function is for the fourth state (Q4) of DFA void state4( char c)
{ if (c == 'b' ) {
dfa = 3;
}
else {
dfa = -1;
}
} // This function is for the fifth state (Q5) of DFA void state5( char c)
{ if (c == 'b' ) {
dfa = 6;
}
else {
dfa = -1;
}
} // This function is for the sixth state (Q6) 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 == 2 || dfa == 4 || dfa == 6 || dfa == 1)
return 1;
else
return 0;
} // driver code int main()
{ char str[] = "aaaabbbbb" ;
if (isAccepted(str))
printf ( "ACCEPTED" );
else
printf ( "NOT ACCEPTED" );
return 0;
} |
// Java program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; n+m=odd } class GFG
{ // dfa tells the number associated // string end in which 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 == 2 || dfa == 4 ||
dfa == 6 || dfa == 1 )
return 1 ;
else
return 0 ;
} // Driver code public static void main(String[] args)
{ char str[] = "aaaabbbbb" .toCharArray();
if (isAccepted(str) == 1 )
System.out.println( "ACCEPTED" );
else
System.out.println( "NOT ACCEPTED" );
} } // This code is contributed by PrinciRaj1992 |
# Python3 program to implement DFS that accepts # all Stringing which follow the language # L = a ^ n b ^ m n + m = odd # 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 Stringing
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 = = 1 or dfa = = 2 or dfa = = 4 or dfa = = 6 ) :
return 1
else :
return 0
# Driver code if __name__ = = "__main__" :
String = "aaaabbbbb"
if (isAccepted(String)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
|
// C# program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; n+m=odd } using System;
class GFG
{ // dfa tells the number associated
// string end in which 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 == 2 || dfa == 4 ||
dfa == 6 || dfa == 1)
return 1;
else
return 0;
}
// Driver code
public static void Main(String[] args)
{
char []str = "aaaabbbbb" .ToCharArray();
if (isAccepted(str) == 1)
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
} // This code contributed by Rajput-Ji |
<?php // PHP program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; n+m=odd } // 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 == 2 || $dfa == 4 ||
$dfa == 6 || $dfa == 1)
return 1;
else
return 0;
} // Driver code // dfa tells the number associated // with the present state $dfa = 0;
$str = array ( "a" , "a" , "a" , "a" ,
"b" , "b" , "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 DFS that accepts // all string which follow the language // L = [ a^n b^m ; n+m=odd } // dfa tells the number associated // string end in which state.
var dfa = 0;
// This function is for
// the starting state (Q0)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 (Q1) 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 (Q2) of DFA
function state2( c) {
if (c == 'b' ) {
dfa = 3;
} else {
dfa = -1;
}
}
// This function is for the
// third state (Q3)of DFA
function state3( c) {
if (c == 'b' ) {
dfa = 4;
} else {
dfa = -1;
}
}
// This function is for the
// fourth state (Q4) of DFA
function state4( c) {
if (c == 'b' ) {
dfa = 3;
} else {
dfa = -1;
}
}
// This function is for the
// fifth state (Q5) of DFA
function state5( c) {
if (c == 'b' ) {
dfa = 6;
} else {
dfa = -1;
}
}
// This function is for the
// sixth state (Q6) 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 == 2 || dfa == 4 || dfa == 6 || dfa == 1)
return 1;
else
return 0;
}
// Driver code
var str = "aaaabbbbb" ;
if (isAccepted(str) == 1)
document.write( "ACCEPTED" );
else
document.write( "NOT ACCEPTED" );
// This code is contributed by gauravrajput1 </script> |
Output:
ACCEPTED
Time complexity: O(n) where n is the length of the given string str
Auxiliary space: O(1)