历史上的今天 首页 传统节日 24节气 企业成立时间 今日 问答 北京今日 重庆今日 天津今日 上海今日 深圳今日 广州今日 东莞今日 武汉今日 成都今日 澳门今日 乌鲁木齐今日 呼和浩特今日 贵阳今日 昆明今日 长春今日 哈尔滨今日 沈阳今日 西宁今日 兰州今日 西安今日 太原今日 青岛今日 合肥今日 南昌今日 长沙今日 开封今日 洛阳今日 郑州今日 保定今日 石家庄今日 温州今日 宁波今日 杭州今日 无锡今日 苏州今日 南京今日 南宁今日 佛山今日 中文/English
首页 > 问答 > K神在《剑指Offer》中提到的“有限状态自动机”算法如何判断字符串是否为数值?

K神在《剑指Offer》中提到的“有限状态自动机”算法如何判断字符串是否为数值?

红豆姐姐的育儿日常

问题更新日期:2026-01-22 08:26:32

问题描述

在《剑指Offer》里,K神所讲的“有限状态自动机
精选答案
最佳答案
在《剑指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

通过上述步骤,使用有限状态自动机算法就能有效地判断一个字符串是否为数值。

友情链接: