概述
听名字就能大概猜出“有限状态自动机”是干嘛的了。
有一个当前状态
pre
每轮循环输入一个
cur
有限状态自动机可以根据事先的定义来进行状态的转移
有限状态自动机并不能降低算法的复杂度,但是可以让代码看起来非常简洁清爽,也不会写着写着就晕掉了。
例题
剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个
'e'
或'E'
,后面跟着一个 整数若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(
'+'
或'-'
)下述格式之一:
至少一位数字,后面跟着一个点
'.'
至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字一个点
'.'
,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-‘)
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
1 | 输入:s = "0" |
示例 2:
1 | 输入:s = "e" |
示例 3:
1 | 输入:s = "." |
示例 4:
1 | 输入:s = " .1 " |
题解
先贴一段我第一次写时的代码,用的是暴力模拟,写半天自己都写晕了,到后面变量名字都开始乱七八糟了,因为不能一次性考虑到所有细节, 所以根据WA给的测试用例缝缝补补勉强通过。
1 | class Solution { |
而使用有限状态自动机就可以让代码非常清晰。我们可以定义如下的状态:

在代码中,我们使用数组+字典来储存上图。只有退出后的状态为 2/3/7/8
中的一个时,我们才认为输入的字符串为合法的数值。
1 | class Solution { |
有的没的
天才操作
13号回的学校。回校前精心挑选了一班快十几分钟的车次,然后当天到了宁波站了才发现终点站是杭州南,不是杭州东,少坐一站可不是快一点嘛。后来找乘务姐姐补了一站路。

新生要来报到了
明天新生就陆续要来报到了,我也该读大三了。没有人永远年轻,但永远有人年轻。
