1. 程式人生 > >【leetcode】140. Word Break II

【leetcode】140. Word Break II

tco com inf strong 不能 bubuko 動態 leet 技術分享

題目如下:

技術分享圖片

解題思路:巨坑的一個題目。一般來說,leetcode這一類題目分為兩種形式,一種是問能不能分割/有幾種分割的方法,一種是列出所有分割的集合。本題是第二種,但是有一些特別坑的用例,其結果是無法分割,又非常容易超時。因此解題方法需要先判斷能不能分割,能的話再計算怎麽分割。首先看能不能分割:可以采用動態規劃的方法。記dp[i] = 0表示s[0:i]區間不能分割,dp[i] = 1表示可以,我們可以得出這樣的遞推表達式,dp[i] = dp[j] if dp[j] == 1 and s[j+1:i+1] in wordDict,這樣能很容易判斷出s是否可以被分割;接下來是找出所有分割的集合,同樣用動態規劃的方法,記dp[i]表示s[0:i]區間所有分割的集合,那麽有:dp[i] = dp[j] * s[j+1:i+1] if len(dp[j]) > 0 and s[j+1:i+1] in wordDict。

代碼如下:

class Solution(object):
    def wordBreak(self, s, wordDict):
        dic = {}
        dp = [0] * len(s)
        for i in wordDict:
            dic[i] = 1

        for i in range(len(s)):
            if s[:i+1] in dic:
                dp[i] = 1
                continue
            for j in range(i+1):
                
if dp[j] > 0 and s[j+1:i+1] in dic: dp[i] = 1 break if dp[-1] == 0: return [] dp = [[] for i in s] for i in range(len(s)): if s[:i+1] in dic: dp[i].append(s[:i+1]) for j in range(i+1):
if len(dp[j]) > 0 and s[j+1:i+1] in dic: for k in dp[j]: length = len(k.replace( ,‘‘)) dp[i].append(k + + s[length:i+1]) return dp[-1]

【leetcode】140. Word Break II