Word Break
Problem Statement
Given a string and a dictionary, can you segment the string into space-separated words from the dictionary? This medium-level DP riddle is a linguist’s playground—break it down!
Example
Input: s = "leetcode", wordDict = ["leet", "code"]
Output: true ("leet code")
Input: s = "applepenapple", wordDict = ["apple", "pen"]
Output: true ("apple pen apple")
Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
Output: false
Code
Java
Python
JavaScript
public class Solution { public boolean wordBreak(String s, ListwordDict) { Set dict = new HashSet<>(wordDict); boolean[] dp = new boolean[s.length() + 1]; dp[0] = true; for (int i = 1; i <= s.length(); i++) { for (int j = 0; j < i; j++) { if (dp[j] && dict.contains(s.substring(j, i))) { dp[i] = true; break; } } } return dp[s.length()]; } }
def word_break(s, wordDict): word_set = set(wordDict) dp = [False] * (len(s) + 1) dp[0] = True for i in range(1, len(s) + 1): for j in range(i): if dp[j] and s[j:i] in word_set: dp[i] = True break return dp[len(s)]
function wordBreak(s, wordDict) { let dict = new Set(wordDict); let dp = new Array(s.length + 1).fill(false); dp[0] = true; for (let i = 1; i <= s.length; i++) { for (let j = 0; j < i; j++) { if (dp[j] && dict.has(s.slice(j, i))) { dp[i] = true; break; } } } return dp[s.length]; }
Explanation
- DP Insight: dp[i] = true if substring[0:i] can be segmented.
- Flow: Check all prefixes that form words with dict.
- Example: "leetcode" → dp[8]=true ("leet"+"code").
Note
Time complexity: O(n²), Space complexity: O(n). Wordplay with DP brilliance!