Java使用有限状态机算法实现判断字符串是否合法

题目描述

请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";
输入:
123123@nowcoder.com
输出:
邮箱格式合法

分析

最容易想到的是正则表达式库,直接解决,当然也是开发中采用的方法。
作为算法题目、算法学习来说,我们可以采取一个常用的算法,有限状态机
采用这个算法可以让我逻辑清晰的判断一个字符串是否符合某规范,缺点是代码量多。
不过能帮助我们写出来逻辑正确的算法,绝对是一种良好的思想。

算法背景

有限状态机(FSM)算法是一种数学模型,用于描述系统在一系列状态之间的转换。它由一组状态、输入事件和输出事件组成。FSM算法的特点如下:

确定性:FSM算法在给定输入的情况下,总是按照相同的顺序执行状态转换。这意味着FSM算法是确定性的,即对于相同的输入,总是产生相同的输出。

有向性:FSM算法中的每个状态转换都有明确的方向,即只能从当前状态转换到下一个状态。这使得FSM算法能够有效地处理复杂的问题,同时避免了无限循环的可能性。

存储简单:FSM算法只需要存储当前状态和一组转换规则,因此其存储需求相对较小。这使得FSM算法适用于资源受限的场合。

可扩展性:FSM算法可以通过添加新的状态和转换规则来扩展,以处理更复杂的问题。这使得FSM算法具有很好的可扩展性。

易于理解和实现:FSM算法的结构简单,易于理解和实现。这使得FSM算法适用于各种领域的问题求解。

有限状态机算法解决的问题包括:

序列检测:FSM算法可以用于检测一个序列是否满足特定的条件,如检测一个字符串是否为有效的日期、检测一个数字序列是否为素数等。

模式识别:FSM算法可以用于识别文本、图像或其他数据中的特定模式,如识别电子邮件地址、识别手写数字等。

控制逻辑:FSM算法可以用于实现简单的控制逻辑,如电梯的上下控制、家庭的照明系统控制等。

计算机硬件控制:FSM算法可以用于实现计算机硬件的控制,如键盘、鼠标等外设的控制。

游戏AI:FSM算法可以用于实现简单的游戏AI,如棋类游戏、迷宫游戏等。

代码

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("邮箱格式不合法");
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述自动化系统的行为。在Java,可以使用类来实现有限状态机。 首先,需要定义一个状态枚举类,如下所示: ```java public enum State { STATE1, STATE2, STATE3 } ``` 然后,可以定义一个状态转移表,它描述了从一个状态到另一个状态的转移条件。例如: ```java public class TransitionTable { private static final Map<State, Map<String, State>> table = new HashMap<>(); static { // 从STATE1转移到STATE2,条件是输入字符串为"abc" Map<String, State> transitionsFromState1 = new HashMap<>(); transitionsFromState1.put("abc", State.STATE2); table.put(State.STATE1, transitionsFromState1); // 从STATE2转移到STATE3,条件是输入字符串为"def" Map<String, State> transitionsFromState2 = new HashMap<>(); transitionsFromState2.put("def", State.STATE3); table.put(State.STATE2, transitionsFromState2); // ... } public static State getNextState(State currentState, String input) { if (!table.containsKey(currentState)) { throw new IllegalArgumentException("Invalid state: " + currentState); } Map<String, State> transitions = table.get(currentState); if (!transitions.containsKey(input)) { throw new IllegalArgumentException("Invalid input: " + input); } return transitions.get(input); } } ``` 最后,可以编写一个状态机类,该类包含一个当前状态和一个输入方法,用于根据输入和状态转移表更新当前状态。例如: ```java public class StateMachine { private State currentState; public StateMachine(State initialState) { this.currentState = initialState; } public void input(String input) { currentState = TransitionTable.getNextState(currentState, input); } public State getCurrentState() { return currentState; } } ``` 可以使用以下代码来测试状态机: ```java StateMachine stateMachine = new StateMachine(State.STATE1); stateMachine.input("abc"); stateMachine.input("def"); System.out.println(stateMachine.getCurrentState()); // 输出STATE3 ``` 这是一个简单的有限状态机实现,可以根据需要进行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会写代码的孙悟空

赠人玫瑰 手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值