DFA for strings not containing consecutive two a’s and starting with ‘a’
Last Updated :
13 Sep, 2022
Prerequisite – Finite Automata Introduction
Problem: Construct deterministic finite automata (DFA) for strings not containing consecutive two a’s and starting with a.
Explanation:
Accept Strings that not contain consecutive two a’s. Check if a given string contain consecutive two a’s or not. The any occurrence of (b-z) should not affect the scenario. Strings should follow this pattern:
a.(ww|(ww.a))*
where, ww = all possible character except a
All those strings that are not fall in the above mentioned pattern are not accepted.
Deterministic finite automata (DFA) of strings that not contain consecutive two a’s given as following below. The initial and starting state in this dfa is q0.
Approach used:
In this program, consider the 6 states to be 0, 1, 2, 3, 4 and 5. Now let us take a variable named DFA which will be initially 0. Whenever any transition takes place, it will update the value of DFA with the number associated with new state.
Example:
If a transition occurs from state 0 to state 1 then the value of DFA will be updated to 1. If a transition occurs from state 2 to state 3 then the value of dfa will be updated to 3. In this way, apply this algorithm on entire string and if in the end, then reach state 1, 2, 4 or 5 then our string will be accepted otherwise not.
Input : geeksaforaageeks
Output : NOT ACCEPTED
Input : aageeksforageeks
Output : NOT ACCEPTED
Input : ageeksaforageeks
Output : ACCEPTED
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int dfa = 0;
void start( char c)
{
if (c == 'a' )
{
dfa = 1;
}
else
{
dfa = 3;
}
}
void state1( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 4;
}
}
void state2( char c)
{
if (c == 'a' )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
void state3( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 3;
}
}
void state4( char c)
{
if (c == 'a' )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
void state5( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 2;
}
}
int isAccepted( char str[])
{
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
return 0;
}
if (dfa == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
int main()
{
char str[] = "ageeksaforageeks" ;
if (isAccepted(str))
cout << "ACCEPTED" ;
else
cout << "NOT ACCEPTED" ;
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
int dfa = 0;
void start( char c)
{
if (c == 'a' ) {
dfa = 1;
}
else {
dfa = 3;
}
}
void state1( char c)
{
if (c == 'a' ) {
dfa = 3;
}
else {
dfa = 4;
}
}
void state2( char c)
{
if (c == 'a' ) {
dfa = 5;
}
else {
dfa = 2;
}
}
void state3( char c)
{
if (c == 'a' ) {
dfa = 3;
}
else {
dfa = 3;
}
}
void state4( char c)
{
if (c == 'a' ) {
dfa = 5;
}
else {
dfa = 2;
}
}
void state5( char c)
{
if (c == 'a' ) {
dfa = 3;
}
else {
dfa = 2;
}
}
int isAccepted( char str[])
{
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
return 0;
}
if (dfa == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
int main()
{
char str[] = "ageeksaforageeks" ;
if (isAccepted(str))
printf ( "ACCEPTED" );
else
printf ( "NOT ACCEPTED" );
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int dfa = 0 ;
static void start( char c)
{
if (c == 'a' )
{
dfa = 1 ;
}
else
{
dfa = 3 ;
}
}
static void state1( char c)
{
if (c == 'a' )
{
dfa = 3 ;
}
else
{
dfa = 4 ;
}
}
static void state2( char c)
{
if (c == 'a' )
{
dfa = 5 ;
}
else
{
dfa = 2 ;
}
}
static void state3( char c)
{
if (c == 'a' )
{
dfa = 3 ;
}
else
{
dfa = 3 ;
}
}
static void state4( char c)
{
if (c == 'a' )
{
dfa = 5 ;
}
else
{
dfa = 2 ;
}
}
static void state5( char c)
{
if (c == 'a' )
{
dfa = 3 ;
}
else
{
dfa = 2 ;
}
}
static int isAccepted( char str[])
{
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
return 0 ;
}
if (dfa == 0 )
return 0 ;
else if (dfa == 3 )
return 0 ;
else
return 1 ;
}
public static void main(String args[])
{
char str[] = "ageeksaforageeks" .toCharArray();
if (isAccepted(str) == 1 )
System.out.printf( "ACCEPTED" );
else
System.out.printf( "NOT ACCEPTED" );
}
}
|
Python3
def start(c):
if (c = = 'a' ):
dfa = 1
else :
dfa = 3
return dfa
def state1(c):
if (c = = 'a' ):
dfa = 3
else :
dfa = 4
return dfa
def state2(c):
if (c = = 'a' ):
dfa = 5
else :
dfa = 2
return dfa
def state3(c):
if (c = = 'a' ):
dfa = 3
else :
dfa = 3
return dfa
def state4(c):
if (c = = 'a' ):
dfa = 5
else :
dfa = 2
return dfa
def state5(c):
if (c = = 'a' ):
dfa = 3
else :
dfa = 2
return dfa
def isAccepted(String):
l = len (String)
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])
else :
return 0
if (dfa = = 3 or dfa = = 0 ) :
return 0
else :
return 1
if __name__ = = "__main__" :
String = "ageeksaforageeks"
if (isAccepted(String)) :
print ( "ACCEPTED" )
else :
print ( "NOT ACCEPTED" )
|
C#
using System;
public class GFG
{
static int dfa = 0;
static void start( char c)
{
if (c == 'a' )
{
dfa = 1;
}
else
{
dfa = 3;
}
}
static void state1( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 4;
}
}
static void state2( char c)
{
if (c == 'a' )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
static void state3( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 3;
}
}
static void state4( char c)
{
if (c == 'a' )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
static void state5( char c)
{
if (c == 'a' )
{
dfa = 3;
}
else
{
dfa = 2;
}
}
static int isAccepted( char [] str)
{
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
return 0;
}
if (dfa == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
public static void Main(String []args)
{
char []str = "ageeksaforageeks" .ToCharArray();
if (isAccepted(str) == 1)
Console.WriteLine( "ACCEPTED" );
else
Console.WriteLine( "NOT ACCEPTED" );
}
}
|
Javascript
<script>
var dfa = 0;
function start(c)
{
if (c === "a" )
{
dfa = 1;
}
else
{
dfa = 3;
}
}
function state1(c)
{
if (c === "a" )
{
dfa = 3;
}
else
{
dfa = 4;
}
}
function state2(c)
{
if (c === "a" )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
function state3(c)
{
if (c === "a" )
{
dfa = 3;
}
else
{
dfa = 3;
}
}
function state4(c)
{
if (c === "a" )
{
dfa = 5;
}
else
{
dfa = 2;
}
}
function state5(c)
{
if (c === "a" )
{
dfa = 3;
}
else
{
dfa = 2;
}
}
function isAccepted(str)
{
var 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 return 0;
}
if (dfa === 0) return 0;
else if (dfa === 3) return 0;
else return 1;
}
var str = "ageeksaforageeks" .split( "" );
if (isAccepted(str) === 1)
document.write( "ACCEPTED" );
else
document.write( "NOT ACCEPTED" );
</script>
|
Output:
ACCEPTED
The time complexity of this program is O(n)
Auxiliary space: O(n) because it is using constant space for variables
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...