LeetCode 139. 单词拆分

简介: LeetCode 139. 单词拆分

 LeetCode 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

提示:

    • 1 <= s.length <= 300
    • 1 <= wordDict.length <= 1000
    • 1 <= wordDict[i].length <= 20
    • swordDict[i] 仅有小写英文字母组成
    • wordDict 中的所有字符串 互不相同


    思路

    借助 map 来实现在 O(1) 时间复杂度内判断当前子串是否在字典 wordDict 中。

    通过 ji下标来标记当前遍历到的子串的左右边界,得到当前的子串 subStr = s[j:i]

    判断该子串是否在字典 wordDict 中出现,并且在这之前以 j结尾的子串 dp[j]是否也为 true。同时满足这两个条件,则表明当前遍历到的子串 subStr = s[j:i]是可以正常进行单词拆分的,记为 true。


    时间复杂度:O(n^2)


    空间复杂度:O(n)

    funcwordBreak(sstring, wordDict []string) bool {
    // 初始化单词map,用于判断当前遍历到的子串是否在wordDict中出现过wordMap :=make(map[string]bool)
    for_, word :=rangewordDict {
    wordMap[word] =true    }
    n :=len(s)
    dp :=make([]bool, n+1)
    dp[0] =true// 边界条件,dp[0]=true 表示空串且合法// i表示子串的结束位置fori :=1; i<=n; i++ {
    // j表示子串的开始位置forj :=0; j<=i/*j < i*/; j++ {
    subStr :=s[j:i]
    ifwordMap[subStr] &&dp[j] {
    dp[i] =true// break            }
            }
        }
    returndp[n]
    }

    image.gif


    目录
    相关文章
    |
    2月前
    |
    算法
    LeetCode第58题最后一个单词的长度
    LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
    LeetCode第58题最后一个单词的长度
    |
    2月前
    |
    算法 JavaScript Python
    【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
    Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
    25 4
    |
    2月前
    |
    Python
    【Leetcode刷题Python】生词本单词整理
    文章提供了一个Python程序,用于帮助用户整理和排版生词本上的单词,包括去除重复单词、按字典序排序,并按照特定的格式要求进行打印排版。
    25 3
    |
    2月前
    |
    Python
    【Leetcode刷题Python】343. 整数拆分
    LeetCode 343题 "整数拆分" 的Python解决方案,使用动态规划算法来最大化正整数拆分为多个正整数之和的乘积。
    16 0
    |
    2月前
    |
    Python
    【Leetcode刷题Python】318. 最大单词长度乘积
    本文提供了LeetCode题目318的Python编程解决方案,题目要求在一个字符串数组中找出两个不含有公共字母的单词,且这两个单词的长度乘积最大,如果不存在这样的两个单词,则返回0。
    14 0
    |
    4月前
    |
    算法
    【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
    【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
    |
    4月前
    |
    存储 SQL 算法
    LeetCode题58: 5种算法实现最后一个单词的长度【python】
    LeetCode题58: 5种算法实现最后一个单词的长度【python】
    |
    4月前
    |
    算法 测试技术 索引
    力扣经典150题第三十二题:串联所有单词的子串
    力扣经典150题第三十二题:串联所有单词的子串
    21 0
    |
    4月前
    |
    算法
    力扣经典150题第二十一题:反转字符串中的单词
    力扣经典150题第二十一题:反转字符串中的单词
    33 0
    |
    4月前
    |
    算法
    力扣经典150题第十九题:最后一个单词的长度
    力扣经典150题第十九题:最后一个单词的长度
    23 0