Open In App
Related Articles

# DFA for accepting the language L = { anbm | n+m=even }

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:

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

 // C++ program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }#include using namespace std; // dfa tells the number associated// with the present stateint dfa = 0; // This function is for// the starting state (zeroth) 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 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 of DFAvoid state2(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the third state of DFAvoid state3(char c){    if (c == 'b')        dfa = 4;    else        dfa = -1;} // This function is for the fourth state of DFAvoid state4(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the fifth state of DFAvoid state5(char c){    if (c == 'b')        dfa = 6;    else        dfa = -1;} // This function is for the sixth state 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 == 3 || dfa == 5)        return 1;    else        return 0;} // Driver codeint main(){    char str[] = "aaabbb";    if (isAccepted(str))        cout << "\nACCEPTED\n";    else        cout << "NOT ACCEPTED\n";    return 0;} // This code is contributed by SHUBHAMSINGH10

## C

 // C program to implement DFA that accepts// all strings which follow the language// L = { a^n b^m ; n+m=even }#include #include  // dfa tells the number associated// with the present stateint dfa = 0; // This function is for// the starting state (zeroth) 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 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 of DFAvoid state2(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the third state of DFAvoid state3(char c){    if (c == 'b')        dfa = 4;    else        dfa = -1;} // This function is for the fourth state of DFAvoid state4(char c){    if (c == 'b')        dfa = 3;    else        dfa = -1;} // This function is for the fifth state of DFAvoid state5(char c){    if (c == 'b')        dfa = 6;    else        dfa = -1;} // This function is for the sixth state 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 == 3 || dfa == 5)        return 1;    else        return 0;} // driver codeint main(){    char str[] = "aaabbb";    if (isAccepted(str))        printf("\nACCEPTED\n");    else        printf("NOT ACCEPTED\n");    return 0;}

## Java

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

 # 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 DFAdef 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 DFAdef 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 DFAdef state2(c):    if (c == 'b'):        dfa = 3    else:        dfa = -1    return dfa # This function is for the third# dfa = state of DFAdef state3(c):    if (c == 'b'):        dfa = 4    else:        dfa = -1    return dfa # This function is for the fourth# dfa = state of DFAdef state4(c):    if (c == 'b'):        dfa = 3    else:        dfa = -1    return dfa # This function is for the fifth# dfa = state of DFAdef state5(c):    if (c == 'b'):        dfa = 6    else:        dfa = -1    return dfa  # This function is for the sixth# dfa = state of DFAdef 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 codeif __name__ == "__main__" :    String = "aaabbb"    if (isAccepted(String)) :        print("ACCEPTED")    else:        print("NOT ACCEPTED") # This code is contributed by# Shubham Singh(SHUBHAMSINGH10)

## C#

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



## Javascript



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.