leetcode--表示数值的字符串(有限状态自动机--编译原理)

题目来源:链接

题目描述:

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

 

代码实现:

def isNumber(self, s: str) -> bool:
        '''try:
            return type(float(s))==float
        except Exception as e:
            return False
        '''
        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 s.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

解题思路:

这是一道有关编译原理中有限状态自动机的题目,难度有点大

关于有限状态自动机的状态转换过程可以看我编译原理专栏中的相关介绍

其实学了有限状态自动机还不够,这题最重要的是要找到状态经过条件转换到哪一个状态

transtable就是状态转换表:每列代表一个条件,每一行代表出发状态

设定合法的状态,最后判断是否在合法状态集中

当然还有大聪明办法,嘻嘻嘻:

def isNumber(self, s: str) -> bool:
    try:
        return type(float(s))==float
    except Exception as e:
        return False

 

你可能感兴趣的:(LeetCode)