139. 单词拆分

题目详情

给定一个非空字符串 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[i] 表示s[0:i]是否可分

DP 初始化

dp[0]表示空集是否可分. 空集作为一个整体, 我们认为是可分的.

DP 递推公式

递推公式使用python来示意.

if dp[i] ==True and s[i:j] in wordDict:
  dp[j] = True

具体代码

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        
        # 初始化
        dp = [False]*(len(s)+1)
        # 动态规划状态 dp[i]表示在 i 是否可以切分.
        # dp[0]表示的是空集是否可分, 空集是一个整体.
        # 我们假设字典中有空集的概念
        dp[0] = True
        
        # [leet] 字典为[le,et]
        # [0,1], [0,2], [0,3], [0,4]
        # [1,2], [1,3], [1,4]
        # [2,3], [2,4]
        # [3,4]
        
      
        for i in range(0,len(s)):
            # j=i+1的原因, 因为python 的 slice 的语法, 我们从1个字母开始比较
            for j in range(i+1,len(s)+1):
                if dp[i] ==True and s[i:j] in wordDict:
                    dp[j] = True
        return dp[-1]   
    原文作者:cptn3m0
    原文地址: https://www.jianshu.com/p/b25bafcf0d73
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞