Programacion de automatas!

Quisiera que me ayudaran, hace unos días me dejaron un ejercicio en java, lo pude hacer por utilizando "matches" y el profesor me dijo que no lo quería así, utilizando solamente cadeas (strings) el ejerció a resolver es este:
                                                              (a|b?|c)+a
Quisiera que me ayudaran con un ejemplo de como programarlo de antemano.

1 respuesta

Respuesta
1
Esa es una expresión regular, lo que tienes que hacer es resolverla por el método de thompson o el método del árbol, esto te despliega un autómata con estados, luego para programarlo es bastante sencillo, por cada estado es un case y por cada lazo es un if.
Por lo que veo te van a salir dos estados creo entonces irían dos case y como 6 o 7 if, aquí te dejo algo que hice así rapido espero te ayude y cualquier pregunta ya sabes que aquí estamos.
String cadena = "bcbcbaabcbcbabca";
        int estado = 0;
        int lon = 0;
        while(cadena.length()!=lon){
        char m = cadena.charAt(lon);
        switch(estado){
            case 0:
               if(m=='a'){
                   estado = 1;
               }
               else if(m=='b'){
                   estado = 0;
               }
               else if(m=='c'){
                   estado = 0;
               }
               else {
                   estado = 3;
               }
               break;
            case 1:
                if(m=='a'){
                    estado = 1;
                }
                else if(m=='b'){
                    estado = 0;
                }
                else if(m=='c'){
                    estado = 0;
                }
                else{
                    estado = 3;
                }
                break;
        }
        lon++;
        }
        if(estado == 1){
            System.out.println("cadena aceptada");
        }
        else{
            System.out.println("cadena no aceptada");
        }
Gracias me ahora ya entiendo la programación, solo tengo unas pequeñas dudas por que dos Case; ¿Y por que el estado 3? ; y y por que el   else if(){}  juntos, Gracias por tu respuesta me ha servido de mucho!
Bueno dos case porque cuando haces el autómata te quedan dos estados uno inicial y el otro de aceptación y la única forma de que se acepte es que que te en el estado 1, o sea si te das cuenta viene una "b" me quedo en el estado 0 viene una "c" me quedo en el estado 0 si viene una a me voy al estado 1 porque si ahí se acabara la cadena se aceptaría igual si vienen muchas más "a" ahora si viene una b o una c me regreso al estado 0 para que siga verficando más caracteres hasta que termine con la a.
El estado 3 es solamente un estado que yo defino que es de error pudiera ser cualquier otro numero, la cuestión es solo saber que termino en otro estado que no fue el 1. Creo que aquí por ser tan pequeño se pudiera quitar pero yo siempre lo agrego por costumbre en cosas más grandes.
Y el else if(){} juntos es como hacer un if else normal en java y va así para que ya no verfique nada más osea si ino una a de una vez se sale, es solo cuestión de optimización, el peor caso seria que revizara hasta que viene una "c" ya que tuvo que verificar todo.
Espero me hayas entendido y si no pues vuelve a preguntar y te seguiré resolviendo todas las dudas que tengas y que yo pueda.
Gracias por todo, me puse a estudiar y ya voy entendiendo mejor Gracias cuando se me presente otra duda tratare de recurrir aquí de nuevo GRACIAS!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas