30.動態規劃-單詞拆分-Leetcode 139(python)
阿新 • • 發佈:2018-12-05
- 問題描述
給定一個非空字串 s 和一個包含非空單詞列表的字典 wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現的單詞。
說明:
- 拆分時可以重複使用字典中的單詞。
- 你可以假設字典中沒有重複的單詞。
- 示例
示例 1:
輸入: s = "leetcode", wordDict = ["leet", "code"] 輸出: true 解釋: 返回 true 因為 "leetcode" 可以被拆分成 "leet code"。
示例 2:
輸入: s = "applepenapple", wordDict = ["apple", "pen"] 輸出:true 解釋: 返回 true 因為 applepenapple 可以被拆分成 apple pen apple 注意你可以重複使用字典中的單詞。
示例 3:
輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] 輸出: false
- 解決思路
動態規劃,用dp陣列來儲存從第一個元素到當前元素組成的字串是否滿足要求,那麼我們需要的就是dp[len(s)-1]
對於第i個元素來說,dp[i]為真的條件是:(1)s[:i+1]在字典中,或(2)s[j+1:i+1]在字典中,且dp[j]為真
- 程式碼
class Solution(object): def wordBreak(self, s, wordDict): """ :type s: str :type wordDict: List[str] :rtype: bool """ #將list變為set wordset = set(wordDict) dp = [0 for _ in range(len(s))] for i in range(len(s)): for j in range(0,i+1): if s[0:i+1] in wordset or s[j+1:i+1] in wordset and dp[j] ==1: dp[i] = 1 break return dp[len(s)-1] == 1