DFA for accepting the language L = {an bm | n+m=odd}
Last Updated :
14 Sep, 2022
Design a deterministic finite automata (DFA) for accepting the language For creating DFA for language L = {an bm | n+m=odd} use elementary mathematics which says,
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++
#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 == 2 || dfa == 4 || dfa == 6 || dfa == 1)
return 1;
else
return 0;
}
int main()
{
char str[] = "aaaabbbbb" ;
if (isAccepted(str))
printf ( "ACCEPTED" );
else
printf ( "NOT ACCEPTED" );
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 == 2 || dfa == 4 ||
dfa == 6 || dfa == 1 )
return 1 ;
else
return 0 ;
}
public static void main(String[] args)
{
char str[] = "aaaabbbbb" .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 = = 1 or dfa = = 2 or dfa = = 4 or dfa = = 6 ) :
return 1
else :
return 0
if __name__ = = "__main__" :
String = "aaaabbbbb"
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 == 2 || dfa == 4 ||
dfa == 6 || dfa == 1)
return 1;
else
return 0;
}
public static void Main(String[] args)
{
char []str = "aaaabbbbb" .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 == 2 || $dfa == 4 ||
$dfa == 6 || $dfa == 1)
return 1;
else
return 0;
}
$dfa = 0;
$str = array ( "a" , "a" , "a" , "a" ,
"b" , "b" , "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 == 2 || dfa == 4 || dfa == 6 || dfa == 1)
return 1;
else
return 0;
}
var str = "aaaabbbbb" ;
if (isAccepted(str) == 1)
document.write( "ACCEPTED" );
else
document.write( "NOT ACCEPTED" );
</script>
|
Output:
ACCEPTED
Time complexity: O(n) where n is the length of the given string str
Auxiliary space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...