【leetcode】Word Break(python)

思路是這樣的,我們從第一個字符開始向後依次找,直到找到一個斷句的地方,使得當前獲得的子串在dict中,若找到最後都沒找到,那麼就是False了。

在找到第一個後,接下來找下一個斷句處,當然是從第一個斷句處的下一個字符開始找連續的子串,但是這時與第一個就稍有不同,比如說word=‘ab’, dict={ 'a', ab', ...},在找到a後,接下來處理的是b,我們發現b不在dict中,但是我們發現b可以和a結合,形成ab,而ab在dict中,所以這裏的每個子串就可以有三種選擇,要麼自己單獨作爲個體到dict中找,要麼就跟前面的結合起來進行找。要麼就是等,等後面的新的字符,構成更長的子串。

但是還有問題,上面我們說的是跟前面的結合起來找,那麼這個前面是個什麼定義?開頭?開頭後的第一個? 第二個?所以我們要記錄一些信息,來表示前面的子串,是從哪裏斷開,從而滿足條件的,那麼我們就可以依次與離當前子串近的部分進行結合。比如:word = ’aab‘, dict = { a, aab },處理a時,是滿足的,下一個a,也是滿足的,處理 b 時,b不在dict中,那麼就與前面的a結合, 形成 ab,發現不在dict 中,那麼繼續與前面的結合,形成 aab,發現在dict 中,那麼 word 整體就滿足條件。



class Solution:
    # @param s, a string
    # @param dict, a set of string
    # @return a boolean
    def wordBreak(self, s, dict):
        if len( s ) == 0 or len(dict) == 0:
            return False
        #初始長度爲0,表示的是之前的元素已經搞定,可以從0開始繼續向後
        dp = [ 0 ]
        # s串的長度,[1, len ( s )],我們挨個去搞定後續的斷句
        for i in range(1, len( s ) + 1):
            #前面所有的合法的斷句處,也就是所有的合法的起始點,因爲若前面的都沒搞定,不可以繼續後面的
            for j in xrange( len( dp ) - 1, -1, -1):
                substr = s[dp[j] : i]
                if substr in dict:
                    dp.append(i)
                    break
        return dp[-1] == len( s )








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章