1. 程式人生 > >【leetcode】Word Break(python)

【leetcode】Word Break(python)

條件 text for -m 是我 tex eas sso false

思路是這種。我們從第一個字符開始向後依次找,直到找到一個斷句的地方,使得當前獲得的子串在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 )








【leetcode】Word Break(python)