[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 wordDicti 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 分钟前
如何更高效地拆解问题?
算法
微尘hjx1 小时前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技1 小时前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er2 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
Pniubi3 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
On The Road :3 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
微尘hjx4 小时前
【Deep-OC-SORT 03】多轨迹算法Deep-OC-SORT-卡尔曼滤波预测过程
算法·yolo·目标跟踪·ultralytics·车跟踪·轨迹算法·deep-oc-sort
老师我太想进步了20266 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
机器人零零壹11 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi14 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法