Prerequisite: Introduction to Deterministic Finite Automata
Construct a DFA that accepts string str starting with input alphabet 'a' but does not contain 'aab' as a substring over input {a, b}.
Examples:
Input: str = "babba"
Output: Not Accepted
Explanation:
The given string doesn't start with 'a'.Input: str = "abbaaaaa"
Output: Accepted
Explanation:
The given string start with 'a'and doesn't contains "aab" as a substring.
Approach:
The transition table helps to understand how the transition of each state takes place on the input alphabets. In the transition table initial state is represented by ---> and the final state is represented by *. There are 3 final states, one initial and one dead state.
State Transition table of the given DFA:
| STATE | INPUT (a) | INPUT (b) |
|---|---|---|
| ---> A | B* | Q (dead state) |
| B* | C* | D* |
| C* | C* | Q (dead state) |
| D* | B* | D* |
| Q (dead state) | Q (dead state) | Q (dead State) |
Below is the DFA diagram:
Below is the implementation of the above DFA:
// C++ code for the above DFA
#include <bits/stdc++.h>
using namespace std;
void stateQ(string);
void stateA(string);
void stateB(string);
void stateC(string);
void stateD(string);
// Function for state Q
// transition
void stateQ(string n)
{
// In dead state
// it shows string
// not accepted
cout << ("Not Accepted");
}
// Function for state A
// transition
void stateA(string n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
stateB(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
// Function for state B transition
void stateB(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(
1, n.length() - 1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substr(
1, n.length() - 1));
}
}
// Function for state C
// transition
void stateC(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for state D
// transition
void stateD(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
stateB(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substr(
1, n.length() + 1));
}
}
// Driver code
int main()
{
// Take string input
string n = "aaaba";
// Call stateA to check
// the input
stateA(n);
}
// This code is contributed by Chitranayal
// Java code for the
// above DFA
import java.util.*;
class GFG{
// Function for state
// A transition
static void stateA(String n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
{
stateB(n.substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateQ(n);
}
}
// Function for transition
// state B
static void stateB(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
{
System.out.print("Accepted");
}
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
stateC(n.substring(1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substring(1));
}
}
// Function for transition
// state C
static void stateC(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
System.out.print("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
stateC(n.substring(1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for transition
// state D
static void stateD(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
System.out.print("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
{
stateB(n.substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateD(n.substring(1));
}
}
}
// Function for state Q
// transition
static void stateQ(String n)
{
// In dead state
// it shows String
// not accepted
System.out.print("Not Accepted");
}
// Driver code
public static void main(String []args)
{
// Take String input
String n ="aaaba";
// Call stateA to check the input
stateA(n);
}
}
// This code is contributed by pratham76
# Python3 code for the above DFA
# Function for state A transition
def stateA(n):
# If at index 0
# 'a' if found then
# call stateB function
# with passing n[1:] to it
if (n[0]=='a'):
stateB(n[1:])
# If at index 0
# 'b' if found then
# call stateQ function
# with passing n to it
else:
stateQ(n)
# Function for state B transition
def stateB(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateC function
# with passing n[1:] to it
if (n[0]=='a'):
stateC(n[1:])
# If at index 0
# 'b' if found then
# call stateD function
# with passing n[1:] to it
else:
stateD(n[1:])
# Function for state C transition
def stateC(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateC function
# with passing n[1:] to it
if (n[0]=='a'):
stateC(n[1:])
# If at index 0
# 'b' if found then
# call stateQ function
# with passing n to it
else:
stateQ(n)
# Function for state D transition
def stateD(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateB function
# with passing n[1:] to it
if (n[0]=='a'):
stateB(n[1:])
# If at index 0
# 'b' if found then
# call stateD function
# with passing n[1:] to it
else:
stateD(n[1:])
# Function for state Q transition
def stateQ(n):
# In dead state
# it shows string
# not accepted
print("Not Accepted")
# Take string input
n ="aaaba"
# Call stateA to check the input
stateA(n)
// C# code for the
// above DFA
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
// Function for state
// A transition
static void stateA(string n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.Substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateQ(n);
}
}
// Function for transition
// state B
static void stateB(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
{
Console.Write("Accepted");
}
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if(n[0] == 'a')
stateC(n.Substring(1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.Substring(1));
}
}
// Function for transition
// state C
static void stateC(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
Console.Write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.Substring(1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for transition
// state D
static void stateD(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
Console.Write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.Substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateD(n.Substring(1));
}
}
}
// Function for state Q
// transition
static void stateQ(string n)
{
// In dead state
// it shows string
// not accepted
Console.Write("Not Accepted");
}
// Driver code
public static void Main(string []args)
{
// Take string input
string n ="aaaba";
// Call stateA to check the input
stateA(n);
}
}
// This code is contributed by rutvik_56
<script>
// JavaScript program to implement
// the above approach
// Function for state
// A transition
function stateA(n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.substr(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateQ(n);
}
}
// Function for transition
// state B
function stateB(n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length == 0)
{
document.write("Accepted");
}
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substr(1));
}
}
// Function for transition
// state C
function stateC(n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length == 0)
document.write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for transition
// state D
function stateD(n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
document.write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.substr(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateD(n.substr(1));
}
}
}
// Function for state Q
// transition
function stateQ(n)
{
// In dead state
// it shows String
// not accepted
document.write("Not Accepted");
}
// Driver code
// Take String input
let n ="aaaba";
// Call stateA to check the input
stateA(n);
// This code is contributed by sanjoy_62.
</script>
Output:
Not Accepted
Time Complexity: O(N)
Auxiliary Space: O(N)