Leetcode刷题:剑指offer【面试题20 表示数值的字符串】

文章目录

  • 确定有限自动机DFA

【面试题20 表示数值的字符串】

难度: 中等

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。

Leetcode题目对应位置: 面试题20:表示数值的字符串

这道题实际上意思是,包含数值的字符串必须有以下模式:A.BeC 或 A.BEC,其中 A、B、C都不是必要的。A 为整数部分,B 为小数点后的小数部分,C 为 e/E 后的指数部分。

  • 若没有整数部分,则 A 省去,同时小数部分 B 不允许为空
  • A 和 C 都可以以正号“+”或负号“-”开头,但 B 不可以
  • A、B、C 都必须是一个整数

确定有限自动机DFA

19、20 两道题把我搞懵了,抄作业:

class Solution:
    def isNumber(self, s: str) -> bool:
        if not s:return False

        transTable = [
            [1,2,7,-1,-1,0],
            [-1,2,7,-1,-1,-1],
            [-1,2,3,4,-1,9],
            [-1,3,-1,4,-1,9],
            [6,5,-1,-1,-1,-1],
            [-1,5,-1,-1,-1,9],
            [-1,5,-1,-1,-1,-1],
            [-1,8,-1,-1,-1,-1],
            [-1,8,-1,4,-1,9],
            [-1,-1,-1,-1,-1,9]
        ]

        cols = {
            "sign":0,
            "number":1,
            ".":2,
            "exp":3,
            "other":4,
            "blank":5  
        }

        def get_col(c):
            if c.isdigit():return 'number'
            elif c in {'+','-'}:return 'sign'
            elif c == '.':return '.'
            elif c in {'E','e'}:return 'exp'
            elif c == ' ':return 'blank'
            else:return 'other'

        legal_state = {2,3,5,8,9}
        state = 0
        for c in s:
            state = transTable[state][cols[get_col(c)]]
            if state == -1:return False
        return True if state in legal_state else False

代码来源:que-ding-you-xian-zi-dong-ji-dfa-by-justyou

你可能感兴趣的:(今天刷题了吗)