https://leetcode.com/problems/valid-number/description/
看了網(wǎng)上的一種據(jù)說(shuō)比較優(yōu)美的方法献雅,有限狀態(tài)機(jī)毯炮。
這一題的狀態(tài)共分為8種情況:
0)初始無(wú)輸入或者輸入了space的狀態(tài)
1)輸入了數(shù)字的狀態(tài)
2)前面無(wú)數(shù)字立帖,只輸入了dot的狀態(tài)
3)輸入了符號(hào)的狀態(tài)
4)前面有數(shù)字和有dot的狀態(tài)
5)'e'或者‘E’之后的狀態(tài)
6)e之后輸入了數(shù)字的狀態(tài)
7)e之后輸入了符號(hào)的狀態(tài)
8)前面有有效輸入以后,輸入space的狀態(tài)
輸入符號(hào)分為以下幾類(lèi):
INVALID, // 0 Include: Alphas, '(', '&' ans so on
SPACE, // 1
SIGN, // 2 '+','-'
DIGIT, // 3 numbers
DOT, // 4 '.'
EXPONENT, // 5 'e' 'E'
class Solution:
# @param s, a string
# @return a boolean
# @finite automation
def isNumber(self, s):
INVALID=0; SPACE=1; SIGN=2; DIGIT=3; DOT=4; EXPONENT=5;
#0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs
transitionTable=[[-1, 0, 3, 1, 2, -1], #0 no input or just spaces
[-1, 8, -1, 1, 4, 5], #1 input is digits
[-1, -1, -1, 4, -1, -1], #2 no digits in front just Dot
[-1, -1, -1, 1, 2, -1], #3 sign
[-1, 8, -1, 4, -1, 5], #4 digits and dot in front
[-1, -1, 6, 7, -1, -1], #5 input 'e' or 'E'
[-1, -1, -1, 7, -1, -1], #6 after 'e' input sign
[-1, 8, -1, 7, -1, -1], #7 after 'e' input digits
[-1, 8, -1, -1, -1, -1]] #8 after valid input input space
state=0; i=0
while i < len(s):
inputtype = INVALID
if s[i]==' ': inputtype=SPACE
elif s[i]=='-' or s[i]=='+': inputtype=SIGN
elif s[i] in '0123456789': inputtype=DIGIT
elif s[i]=='.': inputtype=DOT
elif s[i]=='e' or s[i]=='E': inputtype=EXPONENT
state=transitionTable[state][inputtype]
if state==-1: return False
else: i+=1
return state == 1 or state == 4 or state == 7 or state == 8