[NeetCode 150] Word Break

Word Break

Given a string s and a dictionary of strings wordDict, return true if s can be segmented into a space-separated sequence of dictionary words.

You are allowed to reuse words in the dictionary an unlimited number of times. You may assume all dictionary words are unique.

Example 1:

复制代码
Input: s = "neetcode", wordDict = ["neet","code"]

Output: true

Explanation: Return true because "neetcode" can be split into "neet" and "code".

Example 2:

复制代码
Input: s = "applepenapple", wordDict = ["apple","pen","ape"]

Output: true

Explanation: Return true because "applepenapple" can be split into "apple", "pen" and "apple". Notice that we can reuse words and also not use all the words.

Example 3:

复制代码
Input: s = "catsincars", wordDict = ["cats","cat","sin","in","car"]

Output: false

Constraints:

复制代码
1 <= s.length <= 200
1 <= wordDict.length <= 100
1 <= wordDict[i].length <= 20

s and wordDict[i] consist of only lowercase English letters.

Solution

To break the string, we can break it step by step. If s 0 : n s_{0:n} s0:n can be broken into words, then we just need to consider whether there exists a position m m m that s n : m s_{n:m} sn:m is a word in dictionary. So, we can record the positions that the substrings before these positions are broken, and check whether we can find a substring after these position that appears in dictionary.

One plausible way is to enumerate the next position and check the substring between two positions, whose time complexity is O ( Len 2 ( s ) ) O(\text{Len}^2(s)) O(Len2(s)). Another way is to traverse the dictionary and find one can be put after the last position, whose time complexity is O ( Len ( s ) × ∑ w Len ( w ) ) O(\text{Len}(s)\times\sum_w\text{Len}(w)) O(Len(s)×∑wLen(w))

Code

Enumerate break position:

py 复制代码
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        word_set = set(wordDict)
        brk = [False]*(len(s)+1)
        brk[-1] = True
        for i in range(len(s)):
            subword = ''
            for j in range(i, -1, -1):
                subword = s[j]+subword
                if brk[j-1] and subword in word_set:
                    brk[i] = True
                    break
        print(brk)
        return brk[len(s)-1]

Enumerate dictionary words:

py 复制代码
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False] * (len(s) + 1)
        dp[len(s)] = True

        for i in range(len(s) - 1, -1, -1):
            for w in wordDict:
                if (i + len(w)) <= len(s) and s[i : i + len(w)] == w:
                    dp[i] = dp[i + len(w)]
                if dp[i]:
                    break

        return dp[0]
相关推荐
小龙报12 分钟前
《算法通关指南数据结构和算法篇(2)--- 链表专题》
c语言·数据结构·c++·算法·链表·学习方法·visual studio
艾莉丝努力练剑33 分钟前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
醉颜凉34 分钟前
环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧
c语言·算法·动态规划
大雨淅淅37 分钟前
一文搞懂动态规划:从入门到精通
算法·动态规划
不去幼儿园40 分钟前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
随意起个昵称41 分钟前
【二分】洛谷P2920,P2985做题小记
c++·算法
没书读了1 小时前
计算机组成原理-考前记忆清单
线性代数·算法
Hcoco_me1 小时前
大模型面试题5:矩阵(M*M)特征值分解的步骤
算法·机器学习·矩阵
非著名架构师2 小时前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
星轨初途2 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法