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 SInput: 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:
Below is the implementation of the above approach:
// 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 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. |
# 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# 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. |
<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>
|
NOT ACCEPTED
Time Complexity: O(N) where N is the length of the string
Auxiliary Space: O(1)