DFA for accepting the language L = {an bm | n+m=odd}

• Difficulty Level : Medium
• 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:

1. If n is odd and m is even then their sum will be odd
2. 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++

 // C program to implement DFS that accepts// all string which follow the language// L = { a^n b^m ; n+m=odd }#include #include  // dfa tells the number associated// string end in which state.int dfa = 0; // This function is for// the starting state (Q0)of DFAvoid 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 DFAvoid 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 DFAvoid state2(char c){    if (c == 'b') {        dfa = 3;    }    else {        dfa = -1;    }} // This function is for the third state (Q3)of DFAvoid state3(char c){    if (c == 'b') {        dfa = 4;    }    else {        dfa = -1;    }} // This function is for the fourth state (Q4) of DFAvoid state4(char c){    if (c == 'b') {        dfa = 3;    }    else {        dfa = -1;    }} // This function is for the fifth state (Q5) of DFAvoid state5(char c){    if (c == 'b') {        dfa = 6;    }    else {        dfa = -1;    }} // This function is for the sixth state (Q6) of DFAvoid 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 codeint main(){    char str[] = "aaaabbbbb";    if (isAccepted(str))        printf("ACCEPTED");    else        printf("NOT ACCEPTED");    return 0;}

Java

 // 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 DFAstatic 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 DFAstatic 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 DFAstatic void state2(char c){    if (c == 'b')    {        dfa = 3;    }    else    {        dfa = -1;    }} // This function is for the// third state (Q3)of DFAstatic void state3(char c){    if (c == 'b')    {        dfa = 4;    }    else    {        dfa = -1;    }} // This function is for the// fourth state (Q4) of DFAstatic void state4(char c){    if (c == 'b')    {        dfa = 3;    }    else    {        dfa = -1;    }} // This function is for the// fifth state (Q5) of DFAstatic void state5(char c){    if (c == 'b')    {        dfa = 6;    }    else    {        dfa = -1;    }} // This function is for the// sixth state (Q6) of DFAstatic 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 codepublic 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

 # 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#

 // 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

 

Javascript

 

Output:

ACCEPTED

Time complexity: O(n) where n is the length of the given string str

Auxiliary space: O(1)

My Personal Notes arrow_drop_up