Open In App

Program to construct a DFA which accepts the language having all 'a' before all 'b'

Last Updated : 23 Jul, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a string S, the task is to design a Deterministic Finite Automata (DFA) for accepting the language L = {aNbM | N ≥ 0, M ≥ 0, N+M ≥ 1}. , i.e., a regular language L such that all 'a' occur before the first occurrence of 'b' {a, ab, aab, bb..., }. If the given string follows the given language L, then print “Accepted”. Otherwise, print “Not Accepted”.

Examples

Input: S = "aabbb"
Output: Accepted
Explanation: All the 'a' come before 'b' s.

Input: S = "ba"
Output: Not Accepted
Explanation: 'b' comes before 'a'.

Input: S = "aaa"
Output: Accepted
Explanation: Note that 'b' does not need to occur in S

Input: S = "b"
Output: Accepted
Explanation: Note that 'a' does not need to occur in S

 

Approach: The problem can be accepted only when the following cases are met:

  • All the characters can be 'a'.
  • All the characters can be 'b'.
  • All the 'b' come occur after all the 'a'.
  • There is at least one character in the string.

This can be better visualized with the help of the state transition diagram of the DFA

State Transition Diagram:

State Transition Diagram of the above DFA

Below is the implementation of the above approach:

C++
// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;  

// Function for state zero Q0
int startStateQ0(char s) {
    
    int state;
    if (s == 'a')
        state = 1;
    else if (s == 'b')
        state = 2;
    else
        state = -1;

    return state;
}
        
// Function for first state Q1
int firstStateQ1(char s) {
    
    int state;
    if (s == 'a')
        state = 1;
    else if (s == 'b')
        state = 2;
    else
        state = -1;
        
    return state;
}
        
// Function for second state Q2
int secondStateQ2(char s) {
    
    int state;
    if (s == 'b')
        state = 2;
    else if (s == 'a')
        state = 3;
    else
        state = -1;
        
    return state;
}
        
// Function for third state Q3
int thirdStateQ3(char s) {
    
    int state = 3;
    return state;
}
        
// Function to check 
// if the string is accepted or not
int isAcceptedString(string String) {
    
    int l = String.length();

    // dfa tells the number associated
    // with the present dfa = state
    int state = 0;
    for (int i = 0; i < l; i++) {
        if (state == 0)
            state = startStateQ0(String[i]);
        else if (state == 1)
            state = firstStateQ1(String[i]);
        else if (state == 2)
            state = secondStateQ2(String[i]);
        else if (state == 3)
            state = thirdStateQ3(String[i]);
        else
            return 0;
    }
    if (state == 1 || state == 2)
        return 1;
    else
        return 0;
}

int main() {
    
    string String = "ba";
    if (isAcceptedString(String))
        cout << "ACCEPTED";
    else
        cout << "NOT ACCEPTED";
}     

// This code is contributed by Samim Hossain Mondal.
Java
// Java Program to implement
// the above approach
import java.util.*;
public class GFG {

    // Function for state zero Q0
    static int startStateQ0(char s)
    {

        int state;
        if (s == 'a')
            state = 1;
        else if (s == 'b')
            state = 2;
        else
            state = -1;

        return state;
    }

    // Function for first state Q1
    static int firstStateQ1(char s)
    {

        int state;
        if (s == 'a')
            state = 1;
        else if (s == 'b')
            state = 2;
        else
            state = -1;

        return state;
    }

    // Function for second state Q2
    static int secondStateQ2(char s)
    {

        int state;
        if (s == 'b')
            state = 2;
        else if (s == 'a')
            state = 3;
        else
            state = -1;

        return state;
    }

    // Function for third state Q3
    static int thirdStateQ3(char s)
    {

        int state = 3;
        return state;
    }

    // Function to check
    // if the string is accepted or not
    static int isAcceptedString(String Str)
    {

        int l = Str.length();

        // dfa tells the number associated
        // with the present dfa = state
        int state = 0;
        for (int i = 0; i < l; i++) {
            if (state == 0)
                state = startStateQ0(Str.charAt(i));
            else if (state == 1)
                state = firstStateQ1(Str.charAt(i));
            else if (state == 2)
                state = secondStateQ2(Str.charAt(i));
            else if (state == 3)
                state = thirdStateQ3(Str.charAt(i));
            else
                return 0;
        }
        if (state == 1 || state == 2)
            return 1;
        else
            return 0;
    }

    public static void main(String args[])
    {

        String Str = "ba";
        if (isAcceptedString(Str) != 0)
            System.out.println("ACCEPTED");
        else
            System.out.println("NOT ACCEPTED");
    }
}

// This code is contributed by Samim Hossain Mondal.
Python3
# Function for state zero Q0
def startStateQ0(s):
    if (s == 'a'):
        state = 1
    elif (s == 'b'):
        state = 2
    else:
        state = -1
    return state

# Function for first state Q1
def firstStateQ1(s):
    if (s == 'a'):
        state = 1
    elif (s == 'b'):
        state = 2
    else:
        state = -1
    return state

# Function for second state Q2
def secondStateQ2(s):
    if (s == 'b'):
        state = 2
    elif (s == 'a'):
        state = 3
    else:
        state = -1
    return state

# Function for third state Q3
def thirdStateQ3(s):
    state = 3
    return state

#Function to check 
#if the string is accepted or not
def isAcceptedString(String):
    l = len(String)

    # dfa tells the number associated
    # with the present dfa = state
    state = 0
    for i in range(l):
        if (state == 0):
            state = startStateQ0(String[i])
        elif (state == 1):
            state = firstStateQ1(String[i])
        elif (state == 2):
            state = secondStateQ2(String[i])
        elif (state == 3):
            state = thirdStateQ3(String[i])
        else:
            return 0
    if(state == 1 or state == 2):
        return 1
    else:
        return 0

# Driver code
if __name__ == "__main__":

    String = "ba"
    if (isAcceptedString(String)):
        print("ACCEPTED")
    else:
        print("NOT ACCEPTED")
C#
// C# Program to implement
// the above approach
using System;
class GFG {

    // Function for state zero Q0
    static int startStateQ0(char s)
    {

        int state;
        if (s == 'a')
            state = 1;
        else if (s == 'b')
            state = 2;
        else
            state = -1;

        return state;
    }

    // Function for first state Q1
    static int firstStateQ1(char s)
    {

        int state;
        if (s == 'a')
            state = 1;
        else if (s == 'b')
            state = 2;
        else
            state = -1;

        return state;
    }

    // Function for second state Q2
    static int secondStateQ2(char s)
    {

        int state;
        if (s == 'b')
            state = 2;
        else if (s == 'a')
            state = 3;
        else
            state = -1;

        return state;
    }

    // Function for third state Q3
    static int thirdStateQ3(char s)
    {

        int state = 3;
        return state;
    }

    // Function to check
    // if the string is accepted or not
    static int isAcceptedString(string Str)
    {

        int l = Str.Length;

        // dfa tells the number associated
        // with the present dfa = state
        int state = 0;
        for (int i = 0; i < l; i++) {
            if (state == 0)
                state = startStateQ0(Str[i]);
            else if (state == 1)
                state = firstStateQ1(Str[i]);
            else if (state == 2)
                state = secondStateQ2(Str[i]);
            else if (state == 3)
                state = thirdStateQ3(Str[i]);
            else
                return 0;
        }
        if (state == 1 || state == 2)
            return 1;
        else
            return 0;
    }

    public static void Main()
    {

        string Str = "ba";
        if (isAcceptedString(Str) != 0)
            Console.Write("ACCEPTED");
        else
            Console.Write("NOT ACCEPTED");
    }
}

// This code is contributed by ukasp.
JavaScript
 <script>

        // JavaScript Program to implement
        // the above approach 

        // Function for state zero Q0
        function startStateQ0(s) {
            if (s == 'a')
                state = 1
            else if (s == 'b')
                state = 2
            else
                state = -1
            return state
        }
        
        // Function for first state Q1
        function firstStateQ1(s) {
            if (s == 'a')
                state = 1
            else if (s == 'b')
                state = 2
            else
                state = -1
            return state
        }
        
        // Function for second state Q2
        function secondStateQ2(s) {
            if (s == 'b')
                state = 2
            else if (s == 'a')
                state = 3
            else
                state = -1
            return state
        }
        
        // Function for third state Q3
        function thirdStateQ3(s) {
            state = 3
            return state
        }
        
        // Function to check 
        // if the string is accepted or not
        function isAcceptedString(String) {
            l = String.length;

            // dfa tells the number associated
            // with the present dfa = state
            state = 0
            for (let i = 0; i < l; i++) {
                if (state == 0)
                    state = startStateQ0(String[i])
                else if (state == 1)
                    state = firstStateQ1(String[i])
                else if (state == 2)
                    state = secondStateQ2(String[i])
                else if (state == 3)
                    state = thirdStateQ3(String[i])
                else
                    return 0
            }
            if (state == 1 || state == 2)
                return 1
            else
                return 0
        }

        let String = "ba"
        if (isAcceptedString(String))
            document.write("ACCEPTED")
        else
            document.write("NOT ACCEPTED")

    // This code is contributed by Potta Lokesh
    </script>

Output
NOT ACCEPTED

Time Complexity: O(N) where N is the length of the string
Auxiliary Space: O(1)


Similar Reads