在《剑指Offer》里,K神所讲的“有限状态自动机”算法到底是怎样判断字符串是否为数值的呢?
有限状态自动机是一种计算模型,它有有限个状态,在不同输入下会在这些状态间转换。判断字符串是否为数值时,可将判断过程分解为多个状态,根据输入字符从一个状态转移到另一个状态,最终根据终止状态来判断字符串是否为数值。
首先要定义所有可能的状态,一般包括起始状态、整数部分状态、小数部分状态、指数部分状态等。例如,常见的状态有:
状态编号 | 状态描述 |
---|---|
0 | 起始状态 |
1 | 符号位状态 |
2 | 整数部分状态 |
3 | 小数点状态 |
4 | 小数部分状态 |
5 | 指数符号状态 |
6 | 指数部分状态 |
根据输入字符确定状态之间的转移规则。以下是一些常见规则:
e
E
e
E
从起始状态开始,依次读取字符串中的字符,根据状态转移规则进行状态转移。如果遇到不符合规则的字符,说明该字符串不是数值。
当字符串遍历结束后,检查自动机所处的状态。如果处于合法的终止状态(如整数部分状态、小数部分状态、指数部分状态),则认为该字符串是数值;否则,不是数值。
python复制defisNumber(s):
#定义状态转移表
states=
p=0
forcins:
if'0'<=c<='9':t='d'
elifcin"+-":t='s'
elifcin"eE":t='e'
elifcin".":t=c
else:t='?'
iftnotinstates:returnFalse
p=states
returnpin(2,3,7,8)
#测试
print(isNumber("3.14"))#输出:True
print(isNumber("abc"))#输出:False
通过上述步骤,使用有限状态自动机算法就能有效地判断一个字符串是否为数值。