Word Break II in Python

Suppose we have a non-empty string s and a dictionary called wordDict, this dictionary is containing a list of non-empty words, add spaces in s to construct a sentence where each word is a valid dictionary word. We have to find all such possible sentences. “appleraincoat” and dictionary is [“app”, “apple”, “rain”, “coat”, “raincoat”]

To solve this, we will follow these steps −

  • Create one map memo

  • Define a method called solve, this will take string and wordDict

  • if s is null, then return empty list

  • if s in memo, then −

    • return memo[s]

  • create an array ret

  • for i in range 1 to size of s

    • if substring of s from index 0 to i – 1 present in wordDict, then

      • for j in solve(substring of s from i to end, wordDict)

      • p := substring of s from index 0 to i – 1, concatenate with space and j, then clear extra space from left and right −

      • insert p into ret

  • memo[s] := ret

  • return memo[s]


Let us see the following implementation to get better understanding −

 Live Demo

class Solution(object):
   def wordBreak(self, s, wordDict):
      self.memo = {}
      wordDict = set(wordDict)
      return self.solve(s,wordDict)
   def solve(self,s, wordDict):
      if not s:
         return ['']
      if s in self.memo:
         return self.memo[s]
      ret = []
      for i in range(1,len(s)+1):
         if s[:i] in wordDict:
            for j in self.solve(s[i:],wordDict):
               ret.append((s[:i] + " " + j).strip())
      self.memo[s] = ret
      return self.memo[s]

ob = Solution()
print(ob.wordBreak("appleraincoat",["app","apple","rain","coat","rain coat"]))




['apple rain coat', 'apple raincoat']