DFA for strings not containing consecutive two a’s and starting with ‘a’

Prerequisite – Finite Automata Introduction
Problem: Construct deteministic 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/C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C program to implement DFA for Strings
// not containing consecutive two a's
#include <stdio.h>
#include <string.h>
  
int dfa = 0;
  
// This function is for
// the starting state of DFA
void start(char c)
{
    if (c == 'a') {
        dfa = 1;
    }
    else {
        dfa = 3;
    }
}
  
// This function is for the first state of DFA
void state1(char c)
{
    if (c == 'a') {
        dfa = 3;
    }
    else {
        dfa = 4;
    }
}
  
// This function is for the second state  of DFA
void state2(char c)
{
    if (c == 'a') {
        dfa = 5;
    }
    else {
        dfa = 2;
    }
}
  
// This function is for the third state of DFA
void state3(char c)
{
    if (c == 'a') {
        dfa = 3;
    }
    else {
        dfa = 3;
    }
}
  
// This function is for the forth state of DFA
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[])
{
    // store length of string
    int i, len = strlen(str);
  
    for (i = 0; i < len; i++) {
  
        // printf("%d", dfa);
        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;
}
  
// driver code
int main()
{
    char str[] = "ageeksaforageeks";
    if (isAccepted(str))
        printf("ACCEPTED");
    else
        printf("NOT ACCEPTED");
    return 0;
}
  
// This code is contributed by SHUBHAMSINGH10.

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to implement DFA for Strings
// not containing consecutive two a's
import java.util.*;
  
class GFG
{
  
static int dfa = 0;
  
// This function is for
// the starting state of DFA
static void start(char c)
{
    if (c == 'a'
    {
        dfa = 1;
    }
    else
    {
        dfa = 3;
    }
}
  
// This function is for the first state of DFA
static void state1(char c)
{
    if (c == 'a'
    {
        dfa = 3;
    }
    else
    {
        dfa = 4;
    }
}
  
// This function is for the second state of DFA
static void state2(char c)
{
    if (c == 'a'
    {
        dfa = 5;
    }
    else 
    {
        dfa = 2;
    }
}
  
// This function is for the third state of DFA
static void state3(char c)
{
    if (c == 'a')
    {
        dfa = 3;
    }
    else 
    {
        dfa = 3;
    }
}
  
// This function is for the forth state of DFA
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[])
{
    // store length of string
    int i, len = str.length;
  
    for (i = 0; i < len; i++) 
    {
  
        // System.out.printf("%d", dfa);
        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;
}
  
// Driver code
public static void main(String args[])
{
    char str[] = "ageeksaforageeks".toCharArray();
    if (isAccepted(str) == 1)
        System.out.printf("ACCEPTED");
    else
        System.out.printf("NOT ACCEPTED");
  
}
}
  
// This code is contributed by Arnab Kundu

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to implement DFA for Strings
# not containing consecutive two a's
      
# This function is for the dfa = starting  
# dfa = state (zeroth) of DFA   
def start(c):  
    if (c == 'a'):  
        dfa = 1
    else:  
        dfa = 3
    return dfa  
      
# This function is for the first   
# dfa = state of DFA   
def state1(c):   
    if (c == 'a'):  
        dfa = 3
    else:  
        dfa = 4
    return dfa  
      
# This function is for the second   
# dfa = state of DFA   
def state2(c):  
    if (c == 'a'):  
        dfa = 5
    else:  
        dfa = 2
    return dfa  
      
# This function is for the third   
# dfa = state of DFA   
def state3(c):  
    if (c == 'a'):  
        dfa = 3
    else:  
        dfa = 3
    return dfa  
      
# This function is for the fouth   
# dfa = state of DFA   
def state4(c):  
    if (c == 'a'):  
        dfa = 5
    else:  
        dfa = 2
    return dfa 
      
      
# This function is for the fifth  
# dfa = state of DFA   
def state5(c):  
    if (c == 'a'):  
        dfa = 3
    else:  
        dfa = 2
    return dfa   
      
def isAccepted(String):  
          
    # store length of Stringing   
    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])
        else:  
            return 0
    if(dfa == 3 or dfa == 0) :  
        return 0
    else:  
        return 1
      
# Driver code   
if __name__ == "__main__" :  
    String = "ageeksaforageeks"
    if (isAccepted(String)) :  
        print("ACCEPTED")   
    else:  
        print("NOT ACCEPTED")   
     
# This code is contributed by SHUBHAMSINGH10.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to implement DFA for Strings
// not containing consecutive two a's
using System;
      
public class GFG
{
   
static int dfa = 0;
   
// This function is for
// the starting state of DFA
static void start(char c)
{
    if (c == 'a'
    {
        dfa = 1;
    }
    else
    {
        dfa = 3;
    }
}
   
// This function is for the first state of DFA
static void state1(char c)
{
    if (c == 'a'
    {
        dfa = 3;
    }
    else
    {
        dfa = 4;
    }
}
   
// This function is for the second state of DFA
static void state2(char c)
{
    if (c == 'a'
    {
        dfa = 5;
    }
    else
    {
        dfa = 2;
    }
}
   
// This function is for the third state of DFA
static void state3(char c)
{
    if (c == 'a')
    {
        dfa = 3;
    }
    else
    {
        dfa = 3;
    }
}
   
// This function is for the forth state of DFA
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)
{
    // store length of string
    int i, len = str.Length;
   
    for (i = 0; i < len; i++) 
    {
   
        // System.out.printf("%d", dfa);
        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;
}
   
// Driver code
public static void Main(String []args)
{
    char []str = "ageeksaforageeks".ToCharArray();
    if (isAccepted(str) == 1)
        Console.WriteLine("ACCEPTED");
    else
        Console.WriteLine("NOT ACCEPTED");
   
}
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


Output:

ACCEPTED 

The time complexity of this program is O(n)



My Personal Notes arrow_drop_up

Small things always make you to think big

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, princiraj1992



Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.