在《剑指Offer》里,K神所讲的“有限状态自动机”算法到底是怎样判断字符串是否为数值的呢?
有限状态自动机原理
有限状态自动机是一种计算模型,它有有限个状态,在不同输入下会在这些状态间转换。判断字符串是否为数值时,可将判断过程分解为多个状态,根据输入字符从一个状态转移到另一个状态,最终根据终止状态来判断字符串是否为数值。
判断流程
定义状态
首先要定义所有可能的状态,一般包括起始状态、整数部分状态、小数部分状态、指数部分状态等。例如,常见的状态有:
状态编号 | 状态描述 |
---|---|
0 | 起始状态 |
1 | 符号位状态 |
2 | 整数部分状态 |
3 | 小数点状态 |
4 | 小数部分状态 |
5 | 指数符号状态 |
6 | 指数部分状态 |
确定状态转移规则
根据输入字符确定状态之间的转移规则。以下是一些常见规则:
- 起始状态:输入数字进入整数部分状态;输入正负号进入符号位状态;输入小数点进入小数点状态。
- 符号位状态:输入数字进入整数部分状态。
- 整数部分状态:输入数字保持该状态;输入小数点进入小数部分状态;输入或plaintext复制
e
进入指数符号状态。plaintext复制E
- 小数点状态:输入数字进入小数部分状态。
- 小数部分状态:输入数字保持该状态;输入或plaintext复制
e
进入指数符号状态。plaintext复制E
- 指数符号状态:输入数字进入指数部分状态。
- 指数部分状态:输入数字保持该状态。
进行状态转移
从起始状态开始,依次读取字符串中的字符,根据状态转移规则进行状态转移。如果遇到不符合规则的字符,说明该字符串不是数值。
判断最终状态
当字符串遍历结束后,检查自动机所处的状态。如果处于合法的终止状态(如整数部分状态、小数部分状态、指数部分状态),则认为该字符串是数值;否则,不是数值。
示例代码(Python)
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
通过上述步骤,使用有限状态自动机算法就能有效地判断一个字符串是否为数值。