1. 程式人生 > >30.動態規劃-單詞拆分-Leetcode 139(python)

30.動態規劃-單詞拆分-Leetcode 139(python)

  • 問題描述

給定一個非空字串 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