Explore diverse LeetCode solutions in Python, C++, JavaScript, SQL, and TypeScript. Ideal for interview prep, learning, and code practice in multiple programming languages. Github Repo Link
Given a string s
and a dictionary of strings wordDict
, return true
if s
can be segmented into a space-separated sequence of one or more dictionary words.
Note that the same word in the dictionary may be reused multiple times in the segmentation.
Example 1:
Input: s = "leetcode", wordDict = ["leet","code"] Output: true Explanation: Return true because "leetcode" can be segmented as "leet code".
Example 2:
Input: s = "applepenapple", wordDict = ["apple","pen"] Output: true Explanation: Return true because "applepenapple" can be segmented as "apple pen apple". Note that you are allowed to reuse a dictionary word.
Example 3:
Input: s = "catsandog", wordDict = ["cats","dog","sand","and","cat"] Output: false
Constraints:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s
andwordDict[i]
consist of only lowercase English letters.- All the strings of
wordDict
are unique.
Python
# Tries # time complexity: O(n^2 + m*k) # space complexity: O(n + m*k) from typing import List class TrieNode: def __init__(self): self.isWord = False self.children = {} class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: root = TrieNode() for word in wordDict: curr = root for c in word: if c not in curr.children : curr.children[c] = TrieNode() curr = curr.children[c] curr.isWord = True dp = [False] * len(s) for i in range(len(s)): if i == 0 or dp[i-1]: curr = root for j in range(i, len(s)): c = s[j] if c not in curr.children: break curr = curr.children[c] if curr. isWord: dp[j] = True return dp[-1] # DP 2 # time complexity: O(n^3 +m*k) # space complexity: O(n+m*k) # from typing import List # class Solution: # def wordBreak(self, s: str, wordDict: List[str]) -> bool: # sLen = len(s) # words = set(wordDict) # dp = [False] * (sLen + 1) # dp[0] = True # for i in range(1, sLen + 1): # for j in range(i): # if dp[j] and s[j:i] in words: # dp[i] = True # break # return True # DP 1 # time complexity: O(n*m*k) # space complexity: O(n) # # from typing import List # class Solution: # def wordBreak(self, s: str, wordDict : List[str]) -> bool: # sLen = len(s) # dp = [False] * sLen # for i in range(sLen): # for word in wordDict: # wordLen = len(word) # if i < wordLen - 1: # continue # if i == wordLen - 1 or dp[i-wordLen]: # if s[i-wordLen+1:i + 1] == word: # dp[i] = True # break # print(dp) # return dp[sLen-1] # BFS # time complexity: O(n^3 + m*k) # space complexity: O(n+m*k) # # from collections import deque # from typing import List # class Solution: # def wordBreak(self, s: str, wordDict: List[str]) -> bool: # words = set(wordDict) # queue = deque([0]) # seen = set() # while queue: # start = queue.popleft() # if start == len(s): # return True # for end in range(start + 1, len(s) + 1): # if end in seen: # continue # if s[start:end] in words: # queue.append(end) # seen.add(end) # return False S = "applepenapple" WordDict = ["apple", "pen"] print(Solution(). wordBreak(S, WordDict))