1. 程式人生 > >確定有限自動機 valid number

確定有限自動機 valid number

www. false 包括 含義 進行 discuss dig num 說明

原題地址:http://oj.leetcode.com/problems/valid-number/

題意:判斷輸入的字符串是否是合法的數。

解題思路:這題只能用確定有窮狀態自動機(DFA)來寫會比較優雅。本文參考了http://www.cnblogs.com/zuoyuan/p/3703075.html裏面的內容,在此致謝!

先要知道到底哪些數是合理的。

e之前呢。

123

.123

123.456

123.

+123

+.123

e之後

123

+123

首先這個題有9種狀態:

0初始無輸入或者只有space的狀態
1輸入了數字之後的狀態
2前面無數字,只輸入了dot的狀態
3輸入了符號狀態
4前面有數字和有dot的狀態
5‘e‘ or ‘E‘輸入後的狀態
6輸入e之後輸入Sign的狀態
7輸入e後輸入數字的狀態
8前面有有效數輸入之後,輸入space的狀態

共9種狀態了,難設計的是6,7,8狀態。

分好之後就好辦了,設計出根據輸入進行狀態轉換就OK了。

這裏的輸入可以分:

INVALID=0;#無效輸入包括: Alphas, ‘(‘, ‘&‘ ans so on
SPACE=1
SIGN=2 # ‘+‘ or ‘-‘
DIGIT=3 # numbers
DOT=4 # ‘.‘
EXPONENT=5 # ‘e‘ or ‘E‘

轉移矩陣A(9X6)如下:

-1, 0, 3, 1, 2, -1
-1, 8, -1, 1, 4, 5
-1, -1, -1, 4, -1, -1
-1, -1, -1, 1, 2, -1
-1, 8, -1, 4, -1, 5
-1, -1, 6, 7, -1, -1
-1, -1, -1, 7, -1, -1
-1, 8, -1, 7, -1, -1
-1, 8, -1, -1, -1, -1

行代表了9種狀態,列代表了6種輸入方式也就是6種跳轉方式。舉個例子:A[0][2]=3,這有什麽含義呢?意思是:第0種狀態為【0初始無輸入或者只有space的狀態】,在輸入第2種輸入【SIGN=2 # ‘+‘ or ‘-‘】後,會跳轉到第3種狀態【3輸入了符號狀態】。A[1][1]=8是什麽意思呢?意思是:第1種狀態為【1輸入了數字之後的狀態】,在輸入第1種輸入【SPACE=1】後,跳轉到了第8種狀態【8前面有有效數輸入之後,輸入space的狀態】。

根據以上的解釋,大家應該明白什麽事狀態間的跳轉了,這個共9種狀態,所以是確定有窮自動機。其實難點在於狀態的分割,要把每種情況都想到。

而這9種狀態中:只有1、4、7、8這四種狀態合法,所以最後state跳轉到這四種狀態之一時,說明輸入是合法的!

狀態轉移圖 from leetcode discuss:

技術分享

代碼:

按 Ctrl+C 復制代碼

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

確定有限自動機 valid number