Java utiliza un algoritmo de máquina de estados finitos para determinar si una cadena es legal

Descripción de la pregunta

Verifique si el formato del correo electrónico es legal de acuerdo con la expresión regular proporcionada. Si el formato ingresado por el usuario es legal, envíe "el formato del buzón es legal", de lo contrario, envíe "el formato del buzón no es válido". La expresión regular correspondiente al formato correcto "[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+"; entrada: 123123@
nowcoder
. com
Salida:
El formato del correo electrónico es legal

analizar

Lo más fácil de pensar es la biblioteca de expresiones regulares, que se puede resolver directamente y, por supuesto, también es el método utilizado en el desarrollo.
Como tema de algoritmo y aprendizaje de algoritmos, podemos adoptar un algoritmo de uso común, la máquina de estados finitos .
El uso de este algoritmo me permite juzgar de forma lógica y clara si una cadena cumple con una determinada especificación, la desventaja es que hay mucho código.
Pero definitivamente es una buena idea que puede ayudarnos a escribir algoritmos lógicamente correctos.

Antecedentes del algoritmo

Un algoritmo de máquina de estados finitos (FSM) es un modelo matemático utilizado para describir las transiciones de un sistema entre una secuencia de estados. Consta de un conjunto de estados, eventos de entrada y eventos de salida. Las características del algoritmo FSM son las siguientes:

Determinista: los algoritmos FSM siempre realizan transiciones de estado en el mismo orden dadas las entradas. Esto significa que el algoritmo FSM es determinista, es decir, para la misma entrada, siempre produce la misma salida.

Dirección: cada transición de estado en el algoritmo FSM tiene una dirección clara, es decir, solo puede pasar del estado actual al siguiente. Esto permite que el algoritmo FSM maneje de manera eficiente problemas complejos evitando la posibilidad de bucles infinitos.

Almacenamiento simple: el algoritmo FSM solo necesita almacenar el estado actual y un conjunto de reglas de transición, por lo que sus requisitos de almacenamiento son relativamente pequeños. Esto hace que el algoritmo FSM sea adecuado para situaciones con recursos limitados.

Extensibilidad: los algoritmos FSM se pueden ampliar agregando nuevos estados y reglas de transición para manejar problemas más complejos. Esto hace que el algoritmo FSM sea muy escalable.

Fácil de entender e implementar: la estructura del algoritmo FSM es simple y fácil de entender e implementar. Esto hace que el algoritmo FSM sea adecuado para la resolución de problemas en diversos campos.

Los problemas resueltos por algoritmos de máquinas de estados finitos incluyen:

Detección de secuencia: el algoritmo FSM se puede utilizar para detectar si una secuencia satisface ciertas condiciones, como detectar si una cadena es una fecha válida, detectar si una secuencia de números es un número primo, etc.

Reconocimiento de patrones: los algoritmos FSM se pueden utilizar para reconocer patrones específicos en texto, imágenes u otros datos, como reconocer direcciones de correo electrónico, reconocer números escritos a mano, etc.

Lógica de control: el algoritmo FSM se puede utilizar para implementar una lógica de control simple, como el control de subida y bajada del ascensor, el control del sistema de iluminación del hogar, etc.

Control de hardware de computadora: el algoritmo FSM se puede utilizar para realizar el control de hardware de computadora, como el control de periféricos como el teclado y el mouse.

IA de juegos: el algoritmo FSM se puede utilizar para implementar IA de juegos simples, como juegos de mesa, juegos de laberintos, etc.

código

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
    
    
    static boolean checkCharType(char c){
    
    
        if(c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='0'&&c<='9'){
    
    
            return true;
        }else{
    
    
            return false;
        }
    }
    public static void main(String[] args) {
    
    

        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        String emailMatcher="[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+";

        // //write your code here......
        // Pattern pattern=Pattern.compile(emailMatcher);
        // if(pattern.matcher(str).matches()){
    
    
        //     System.out.println("邮箱格式合法");
        // }else{
    
    
        //     System.out.println("邮箱格式不合法");
        // }
        /*
        0:初始
        1:123123
        2:@
        3:nowcoder
        4: .
        5: com

        */
        int status=0;
        for(int i=0;i<str.length();++i){
    
    
            char c=str.charAt(i);
            if(status==0){
    
    
                if(checkCharType(c)){
    
    
                    status=1;
                }else{
    
    
                    break;
                }
            }else if(status==1){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else if(c=='@'){
    
    
                    status=2;
                }else{
    
    
                    break;
                }
            }else if(status==2){
    
    
                if(checkCharType(c)){
    
    
                    status=3;
                }else{
    
    
                    break;
                }
            }else if(status==3){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else if(c=='.'){
    
    
                    status=4;
                }else{
    
    
                    break;
                }
            }else if(status==4){
    
    
                if(checkCharType(c)){
    
    
                    status=5;
                }else{
    
    
                    break;
                }
            }else if(status==5){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else{
    
    
                    status=-1;
                    break;
                }
            }
        }
        if(status==5){
    
    
            System.out.println("邮箱格式合法");
        }else{
    
    
            System.out.println("邮箱格式不合法");
        }

    }
}

Supongo que te gusta

Origin blog.csdn.net/artistkeepmonkey/article/details/132628883
Recomendado
Clasificación