DFA para strings que no contienen dos a consecutivas y que comienzan con ‘a’

Prerrequisito: autómatas finitos Problema de introducción  : construir autómatas finitos deterministas (DFA) para strings que no contengan dos a consecutivas y que comiencen con a.

Explicación: 
acepte strings que no contengan dos a consecutivas. Compruebe si una string determinada contiene dos a consecutivas o no. Cualquier ocurrencia de (bz) no debería afectar el escenario. Las strings deben seguir este patrón: 

a.(ww|(ww.a))*
where, ww = all possible character except a 

No se aceptan todas aquellas strings que no se encuadren en el patrón mencionado anteriormente.
Autómatas finitos deterministas (DFA) de strings que no contienen dos a consecutivas que se indican a continuación. El estado inicial y de partida en este dfa es q0.

Enfoque utilizado: 
en este programa, considere que los 6 estados son 0, 1, 2, 3, 4 y 5. Ahora tomemos una variable llamada DFA que inicialmente será 0. Cada vez que se produzca una transición, actualizará el valor. de DFA con el número asociado con el nuevo estado.

Ejemplo: 
si ocurre una transición del estado 0 al estado 1, el valor de DFA se actualizará a 1. Si ocurre una transición del estado 2 al estado 3, el valor de dfa se actualizará a 3. De esta manera, aplique este algoritmo en toda la string y, si al final, alcanza el estado 1, 2, 4 o 5, nuestra string será aceptada; de lo contrario, no. 

Input : geeksaforaageeks
Output : NOT ACCEPTED

Input : aageeksforageeks
Output : NOT ACCEPTED

Input : ageeksaforageeks
Output : ACCEPTED 

Implementación:

C++

// C++ program to implement DFA for Strings
// not containing consecutive two a's
#include <bits/stdc++.h>
using namespace std;
 
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 fourth 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++)
    {
        // cout<<"%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))
        cout << "ACCEPTED";
    else
        cout << "NOT ACCEPTED";
         
    return 0;
}
 
// This code is contributed by shivanisinghss2110.

C

// 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 fourth 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.

Java

// 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 fourth 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

Python3

# 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 fourth  
# 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.

C#

// 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 fourth 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 */

Javascript

<script>
 
// JavaScript program to implement DFA
// for Strings not containing consecutive
// two a's
var dfa = 0;
 
// This function is for
// the starting state of DFA
function start(c)
{
    if (c === "a")
    {
        dfa = 1;
    }
    else
    {
        dfa = 3;
    }
}
 
// This function is for the first state of DFA
function state1(c)
{
    if (c === "a")
    {
        dfa = 3;
    }
    else
    {
        dfa = 4;
    }
}
 
// This function is for the second state of DFA
function state2(c)
{
    if (c === "a")
    {
        dfa = 5;
    }
    else
    {
        dfa = 2;
    }
}
 
// This function is for the third state of DFA
function state3(c)
{
    if (c === "a")
    {
        dfa = 3;
    }
    else
    {
        dfa = 3;
    }
}
 
// This function is for the fourth state of DFA
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)
{
     
    // Store length of string
    var 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
var str = "ageeksaforageeks".split("");
if (isAccepted(str) === 1)
    document.write("ACCEPTED");
else
    document.write("NOT ACCEPTED");
     
// This code is contributed by rdtank
     
</script>

Producción: 

ACCEPTED 

La complejidad temporal de este programa es O(n)
 

Publicación traducida automáticamente

Artículo escrito por SHUBHAMSINGH10 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *