One line slick solution: using regular matching.
import re
...
return bool(re.match("^\s*[\+-]?((\d+(\.\d*)?)|\.\d+)([eE][\+-]?\d+)?\s*$", s))
Run Time is 84 ms.
Another solution is to use states transition method, which is a little hard to get.
Solution:
# T:O(n) S:O(1) class Solution: # @param s, a string # @return a boolean def isNumber(self, s): transition_table = [[-1, 0, 3, 1, 2, -1], # next states for state 0 [-1, 8, -1, 1, 4, 5], # next states for state 1 [-1, -1, -1, 4, -1, -1], # next states for state 2 [-1, -1, -1, 1, 2, -1], # next states for state 3 [-1, 8, -1, 4, -1, 5], # next states for state 4 [-1, -1, 6, 7, -1, -1], # next states for state 5 [-1, -1, -1, 7, -1, -1], # next states for state 6 [-1, 8, -1, 7, -1, -1], # next states for state 7 [-1, 8, -1, -1, -1, -1]] # next states for state 8 state = 0 for char in s: inputType = InputType.INVALID if char.isspace(): inputType = InputType.SPACE; elif char == '+' or char == '-': inputType = InputType.SIGN elif char.isdigit(): inputType = InputType.DIGIT elif char == '.': inputType = InputType.DOT elif char == 'e' or char == 'E': inputType = InputType.EXPONENT; state = transition_table[state][inputType]; if state == -1: return False;Run Time: 96 ms
No comments:
Post a Comment