title: 【LeetCode】0139. Word Break
date: 2018-12-21
is_modified: false
disqus: cynthiahackmd
categories:
Given a non-empty string s and a dictionary wordDict containing a list of non-emptywords, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
Note:
- The same word in the dictionary may be reused multiple times in the segmentation.
- You may assume the dictionary does not contain duplicate words.
Example 1:
Example 2:
Example 3:
Related Topics: Dynamic Programming
這題是要將題目給定的句子拆解成字典中的單字。第一個想到的就是我最愛的暴力法,拆、拆、拆就對了!
也就是暴力解,想法很簡單,就是把句子拆成前後兩句下去查,一旦有一種拆法可以查的到就回傳 True,否則回傳 False。當然為了避免大量重複計算,另外用 HashTable 記錄查過得結果,解法如下:
但果不期然,效率有點差跑出了個 740 ms, 1.20% 的成績,摸摸鼻子改寫 DP 去。
這題大概是難得我這幾天整理的題目中,DP 解終於不是欠著的題目了 XDDD
這邊使用了一個 dp 陣列記錄結果,其中 dp[i] 中記錄著字串 s[:i] 是否能夠拆解,接下來若是 s[i:j] 也可以進行拆解,因為已知 s[:i] 可拆解,又s[i:j] 可拆解,故 s[:j] 可拆解,因此記錄 dp[j] 為 True,按這關係推導,最後就可以判斷目標字串是否可以被拆解。
這效能果然好上不少,跑出了 68 ms, 15.49% 的成績。
看到我的 code 雖然有比上次進步,但其實無條件進位也才 16% 而已,有些好奇前面 code是怎樣的,所以手賤點了前段班的 code 出來看。
發現他雖然也是用 DP 解,但他加上了點巧思,與我不同的是他是由後向前遍歷,並寫加上了檢查距離的限制,限制在字典中最長的單字長度上,檢查再多也沒有意義,因為字典就沒有這麼長的單字咩。最後跑出來成績為 36 ms, 99.65% 。
本文作者: 辛西亞.Cynthia
本文連結: 辛西亞的技能樹 / hackmd 版本
版權聲明: 部落格中所有文章,均採用 姓名標示-非商業性-相同方式分享 4.0 國際 (CC BY-NC-SA 4.0) 許可協議。轉載請標明作者、連結與出處!