[leetcode]Valid Number @ Python


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

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

解題思路:這題只能用確定有窮狀態自動機(DFA)來寫會比較優雅。本文參考了http://blog.csdn.net/kenden23/article/details/18696083里面的內容,在此致謝!

首先這個題有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:

代碼:

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
                

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM