动态规划-leetcode-139

110 阅读2分钟

0️⃣python数据结构与算法学习路线
学习内容:

  • 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
  • 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…

题目:

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:

  • 拆分时可以重复使用字典中的单词。
  • 你可以假设字典中没有重复的单词。

输入输出:

输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。

解题思路:

方法一:动态规划
在这里插入图片描述

  1. 初始化dp = [False,⋯,False],长度为 n+1。即dp = [False]*(n+1)或dp = [0] * (n+1),n为字符串长度。dp[i]表示 s 的前 i 位是否可以用 wordDict 中的单词表示。
  2. 初始化 dp[0]=True,空字符可以被表示。

遍历字符串的所有子串,遍历开始索引 i,遍历区间 [0,n):

遍历结束索引 j,遍历区间 [i+1,n+1):

若 dp[i]=True且s[i,⋯,j) 在 wordlist 中:dp[j]=True。解释:dp[i]=True 说明 s 的前 i 位可以用 wordDict 表示,则 s[i,⋯,j) 出现在 wordDict 中,说明 s 的前 j 位可以表示。

  1. 返回 dp[n]

算法实现:

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:       
        n = len(s)
        dp = [False]*(n+1)
        dp[0]=True
        for i in range(n):
            for j in range(i+1,n+1):
                if(dp[i] and (s[i:j] in wordDict)):
                    dp[j]=True
        return dp[-1]

出现问题:

  1. 没有考虑到s为空的时候应该返回ture 所以设置dp[0] = 1