DFA(有限自动机)的实例用法,判断字符串是否是十进制

在这里插入图片描述


'''DFA(有限自动机)'''
def isNumber(self, s: str) -> bool:
    state = [
        {},
        # 状态1,初始状态(扫描通过的空格)
        {"blank": 1, "sign": 2, "digit": 3, ".": 4},
        # 状态2,发现符号位(后面跟数字或者小数点)
        {"digit": 3, ".": 4},
        # 状态3,数字(一直循环到非数字)
        {"digit": 3, ".": 5, "e": 6, "blank": 9},
        # 状态4,小数点(后面只有紧接数字)
        {"digit": 5},
        # 状态5,小数点之后(后面只能为数字,e,或者以空格结束)
        {"digit": 5, "e": 6, "blank": 9},
        # 状态6,发现e(后面只能符号位, 和数字)
        {"sign": 7, "digit": 8},
        # 状态7,e之后(只能为数字)
        {"digit": 8},
        # 状态8,e之后的数字后面(只能为数字或者以空格结束)
        {"digit": 8, "blank": 9},
        # 状态9, 终止状态 (如果发现非空,就失败)
        {"blank": 9}
    ]
    cur_state = 1
    for c in s:
        if c.isdigit():
            c = "digit"
        elif c in " ":
            c = "blank"
        elif c in "+-":
            c = "sign"
        if c not in state[cur_state]:
            return False
        cur_state = state[cur_state][c]
    if cur_state not in [3, 5, 8, 9]:
        return False
    return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值