Open In App

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

Improve
Improve
Like Article
Like
Save
Share
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)



Last Updated : 14 Dec, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads