【leetcode】140. Word Break II
阿新 • • 發佈:2018-09-01
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