有限状态自动机

本文介绍了有限状态自动机(DFA)的概念,并通过一个字符串判断是否表示数值的实战例子,详细阐述了如何建立状态转移并进行状态判断。关键在于列出所有可能的状态,根据输入字符进行状态转移,最终确定是否符合要求。状态包括空格、e前的符号、小数点前后的数字等,通过状态转移判断字符串是否表示合法数值。
摘要由CSDN通过智能技术生成

有限状态自动机是什么?

其实我之前做算法题看题解的时候经常看到有状态转移的方法(动态规划的那种转移除外)
今天碰到一个字符串中匹配数字的,其中之一有小数或科学计算法的数或正数负数就是TRUE,否则为false。

在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表Σ的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。

重点

找到所有状态罗列出来,建立每次输入都改变他状态的状态转移。如果最后的状态是合法的,那么证明这个输入符合条件。
对于例题
一个仅有ab的字符串,要求b需要成对出现,否则不合法。
那么就是需要a或者abb两种
第一个状态是a
第二个是ab,那么此时怎么转移,如果下一个是a,出现aba不合法,即
第三个状态aba,然后无论输入什么只能在第三个停留,直到输出
如果ab后输入是b那么合法,要画第四个状态abb吗?当然不能,因为abb合法之后,下一步还有可能是a或b,所以自己是回到第一个状态,从这个新起点开始判断后续是否合法
在这里插入图片描述
一个自环表示状态还在这里没有转移走,要判断输出,只要在所有状态里找出合法状态即可,如果只有abb怎么转移都是停在状态1,所以判断最后停下来是不是等于1

实战

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。

状态有什么

0表示空格
1表示e前边的±号
2表示小数点前的数字
3表示小数点、小数点后的数字
4表示当小数点前为空格时小数点、小数点后的数字
5表示e
6表示e后的正负号
7表示e后的数字
8表示结尾的空格
在这里插入图片描述
其实我也不一定能画出来,图来自leetcode。

开始写代码实现

第一步构建状态转移

/*
		 * 0表示空格
		1表示e前边的+-号
		2表示小数点前的数字
		3表示小数点、小数点后的数字
		4表示当小数点前为空格时小数点、小数点后的数字
		5表示e
		6表示e后的正负号
		7表示e后的数字
		8表示结尾的空格
		 */
		Map[] states = {
   
			new HashMap<Character, Integer>() {
   {
   put(' ', 0); put('d', 2); put('s', 1); put('.', 4);}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值