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

news/2024/11/29 13:29:37/

题目描述

请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[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:1231232:@3:nowcoder4: .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("邮箱格式不合法");}}
}

http://www.ppmy.cn/news/1078661.html

相关文章

淘宝API接口:提高电商运营效率与用户体验的利器(淘宝API接口使用指南)

淘宝API接口&#xff1a;提高电商运营效率与用户体验的利器 随着电商行业的快速发展&#xff0c;淘宝作为国内最大的电商平台之一&#xff0c;不断探索和创新&#xff0c;以满足不断变化的用户需求和商家需求。其中&#xff0c;淘宝API接口便是其创新的一个重要方面。本文将深…

哈希表与有序表

哈希表与有序表 Set结构 key Map结构 key-value 哈希表 哈希表的时间复杂度都是常数项级别的&#xff0c;但常数较大 增删改查的时间都是常数级别的&#xff0c;与数据量无关 当哈希表存储的值是基础数据类型&#xff08;Integer - int&#xff09;&#xff0c;哈希表中内…

【Nginx】Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

$remote_addr 代表客户端IP。注意&#xff0c;这里的客户端指的是直接请求Nginx的客户端&#xff0c;非间接请求的客户端。假设用户请求过程如下&#xff1a; 用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器那么&#xff0c;默认情况下&#xff0c;…

[管理与领导-62]:IT基层管理者 - 潜技能 - 1 - 职场中的陷阱 - 了解职场中潜法则,保护自己

目录 前言&#xff1a; 生存法则一、老板对你讲的道理&#xff0c;永远都是对他有利的 生存法则二、目标要明确&#xff0c;拿钱要及时 生存法则三、有点的领导夸你越多&#xff0c;你得到的越少 生存法则四、表面讲大义&#xff0c;心里是生意 生存法则五、得罪人是要付…

ROS获取目标点导航完成状态(rospy)

文章目录 ROS获取目标点导航完成状态1. Action方式2. Topic方式3. 验证4. 状态码取值 ROS获取目标点导航完成状态 1. Action方式 在ROS中&#xff0c;导航框架默认使用move_base&#xff0c;所以对于导航状态的获取往往需要往move_base的交互状态组建上考虑。 一种常见的方法…

Ceph入门到精通-OSD waring 设置建议

OSD 以下检查表明 OSD 节点存在问题。 警告 1 在 /var/lib/ceph/osd 中找到的多个ceph_fsid值。 这可能意味着您正在托管许多集群的 OSD 此节点或某些 OSD 配置错误以加入 您期望的集群。 2 设置可能会导致数据丢失&#xff0c;因为如果 未达到最小值&#xff0c;Ceph 将不会确…

JavaScript页面怎么跳转

在JavaScript中&#xff0c;可以使用window.location对象来实现页面跳转。window.location对象包含了当前页面的URL信息&#xff0c;可以通过修改它的属性来实现页面跳转。 以下是一些常见的页面跳转方式&#xff1a; 使用window.location.href属性来跳转到一个新的URL&#…

QtCreator中pro项目文件格式说明

名称说明QT core gui添加本项目中需要的模块&#xff0c;影响后面代码文件include的时候自动弹出下拉选择&#xff0c;如果pro文件没有引入该模块则无法自动语法提示&#xff0c;一般打包发布的时候对应动态库文件比如 Qt5Core.dll。TARGET xxx生成最后目标文件的名字&#x…