力扣刷题Python笔记:单词拆分

题目

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

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

力扣刷题Python笔记:单词拆分_第1张图片
来源:力扣(LeetCode)

Python解法

这道题本以为用双指针解法做,但是我发现双指针情况要考虑的的情况太多,然后~~~以下解题思路和代码均来自力扣题解。

动态规划解法

具体的解题思路如下:
①初始化 dp=[False, ⋯, False],长度为 n+1,其中 n 为字符串长度,dp[i] 表示字符串 s 的前 i 位是否可以用 wordDict 中的单词表示;
②初始化 dp[0]=True,代表空字符可以用 wordDict 表示;
③遍历字符串的所有子串,遍历开始索引 i,遍历区间 [0,n):
遍历结束索引 j,遍历区间 [i+1,n+1):
若 dp[i]=True 且 s[i,⋯,j) 在 wordlist 中,则dp[j]=True。
解释:dp[i]=True 说明 s 的前 i 位可以用 wordDictwordDict 表示,又因为 s[i,⋯,j) 出现在 wordDictwordDict 中,说明 s 的前 j 位可以用 wordDict 表示。
④返回 dp[-1],即 dp 的前 n 位是否能够用 wordDict 表示。

注意:当 dp[j] 等于 True时,我们要继续遍历内循环,因为 wordDict 中可能有字符串包含另一字符串。

代码如下:

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]

你可能感兴趣的:(力扣python刷题,算法)