from enum import Enum
class Solution:
InputType = Enum('InputType', [
'NUMBER',
'POINT',
'SIGN',
'EXP',
'SPACE',
'ILLEGAL',
])
State = Enum('State', [
'INITIAL',
'INTEGER',
'NUM_SIGN',
'POINT_WITHOUT_INT',
'POINT',
'FRACTION',
'EXP',
'EXP_SIGN',
'EXP_NUMBER',
'END',
])
mapping = {
State.INITIAL: {
InputType.SPACE: State.INITIAL,
InputType.NUMBER: State.INTEGER,
InputType.SIGN: State.NUM_SIGN,
InputType.POINT: State.POINT_WITHOUT_INT,
},
State.INTEGER: {
InputType.NUMBER: State.INTEGER,
InputType.POINT: State.POINT,
InputType.EXP: State.EXP,
InputType.SPACE: State.END,
},
State.NUM_SIGN: {
InputType.NUMBER: State.INTEGER,
InputType.POINT: State.POINT_WITHOUT_INT,
},
State.POINT_WITHOUT_INT: {
InputType.NUMBER: State.FRACTION,
},
State.POINT: {
InputType.NUMBER: State.FRACTION,
InputType.EXP: State.EXP,
InputType.SPACE: State.END,
},
State.FRACTION: {
InputType.NUMBER: State.FRACTION,
InputType.EXP: State.EXP,
InputType.SPACE: State.END,
},
State.EXP: {
InputType.SIGN: State.EXP_SIGN,
InputType.NUMBER: State.EXP_NUMBER,
},
State.EXP_SIGN: {
InputType.NUMBER: State.EXP_NUMBER,
},
State.EXP_NUMBER: {
InputType.NUMBER: State.EXP_NUMBER,
InputType.SPACE: State.END,
},
State.END: {
InputType.SPACE: State.END,
},
}
def match(self, char):
if char.lower() == 'e':
return self.InputType.EXP
elif char == ' ':
return self.InputType.SPACE
elif char in ('-', '+'):
return self.InputType.SIGN
elif char == '.':
return self.InputType.POINT
elif char in (str(t) for t in range(10)):
return self.InputType.NUMBER
else:
return self.InputType.ILLEGAL
def isNumber(self, s: str) -> bool:
state = self.State.INITIAL
for c in s:
ctype = self.match(c)
if ctype not in self.mapping[state]:
return False
state = self.mapping[state][ctype]
return state in [self.State.INTEGER, self.State.POINT, self.State.FRACTION, self.State.EXP_NUMBER, self.State.END]